PDA

View Full Version : سوال: راهنمایی در مورد ذخیره چند رشته در یک فیلد؟



mohsen_f_b
پنج شنبه 06 خرداد 1389, 23:42 عصر
سلام
دوستان یه سوال دارم فوری و فوتی اگه جواب بدین ممنون می شم.
من یک Table توی بان SQL Server دارم که فقط 2 تا فیلد داره.
1- ID - که خودش عدد میده
2-Name - که توش می تونیم اسم وارد کنیم.
حالا توی برنامه 4 تا TextBox دارم که از TextBox1 شروع تا TextBox4.
حالا می خوام یه Butten بزارم که وقتی روی اون کلیک کردیم اطلاعات این 4 تا اسم همشون برن و توی بانک ذخیره بشن.
یه راهش اینه که 4 با دستور Insert رو اجرا کنم به غیر از این راه، راه دیگه ای نیست؟
حالا نمی دونم چون اسم TextBox ها یکی هستش و فقط عددش فرق می کنه از یه رویه خواص استفاده کنیم که فقط یه بار از دستور Insert استفاده کنیم؟

ببخشید دیگه یکم طولانی شد.
در ضمن این یه مثاله من توی یه قسمت با چندین فیلد مشابه می خوام این کارو کنم.
باتشکر

ricky22
پنج شنبه 06 خرداد 1389, 23:50 عصر
4 تا textbox رو الحاق کنید و بین اونا یک کاراکتر جدا کننده بزارید برای اینکه بعدا بتونید اونا رو جدا کنید.

mohsen_f_b
پنج شنبه 06 خرداد 1389, 23:56 عصر
4 تا textbox رو الحاق کنید و بین اونا یک کاراکتر جدا کننده بزارید برای اینکه بعدا بتونید اونا رو جدا کنید.

باتشکر از پاسخ شما.
دوست عزیز هر Name باید یک ID برای خودش بگیره.

ricky22
جمعه 07 خرداد 1389, 00:05 صبح
اها شما می خوای حالت حلقه داشته باشه.
این تکه کد همه ی text box های فرم رو خالی می کنه
می تونید با توجه به نیاز خودتون ازش استفاده کنید
یعنی به جای قسمت خالی کردن کد insert رو بنویسی

foreach(Control ctl in parent.Controls)
{

if (ctlControls.Count > 0) ClearConent(ctl);

if(ctl is Textbox) ((TextBox)ctl).Text = string.Empty;


}

mohsen_f_b
جمعه 07 خرداد 1389, 00:09 صبح
اها شما می خوای حالت حلقه داشته باشه.
این تکه کد همه ی text box های فرم رو خالی می کنه
می تونید با توجه به نیاز خودتون ازش استفاده کنید
یعنی به جای قسمت خالی کردن کد insert رو بنویسی

foreach(Control ctl in parent.Controls)
{

if (ctlControls.Count > 0) ClearConent(ctl);

if(ctl is Textbox) ((TextBox)ctl).Text = string.Empty;


}

باتشکر فراوان دوست عزیز.
چک می کنم.

mohsen_f_b
جمعه 07 خرداد 1389, 10:11 صبح
سلام
از دوستان راه دیگه ای ندارن؟

باتشکر

اَرژنگ
جمعه 07 خرداد 1389, 11:40 صبح
سلام
دوستان یه سوال دارم فوری و فوتی اگه جواب بدین ممنون می شم.
من یک Table توی بان SQL Server دارم که فقط 2 تا فیلد داره.
1- ID - که خودش عدد میده
2-Name - که توش می تونیم اسم وارد کنیم.
حالا توی برنامه 4 تا TextBox دارم که از TextBox1 شروع تا TextBox4.
حالا می خوام یه Butten بزارم که وقتی روی اون کلیک کردیم اطلاعات این 4 تا اسم همشون برن و توی بانک ذخیره بشن.
یه راهش اینه که 4 با دستور Insert رو اجرا کنم به غیر از این راه، راه دیگه ای نیست؟
حالا نمی دونم چون اسم TextBox ها یکی هستش و فقط عددش فرق می کنه از یه رویه خواص استفاده کنیم که فقط یه بار از دستور Insert استفاده کنیم؟

ببخشید دیگه یکم طولانی شد.
در ضمن این یه مثاله من توی یه قسمت با چندین فیلد مشابه می خوام این کارو کنم.
باتشکر
این یک مثاله که در مورد مشکل اصلی هیچ چی نگفته، اگر اینکه Insert چطوری عمل میکنه را میدانید البته که باید ۴ بار صدا زده بشه که ۴ تا رکورد را ذخیره کند.
مشکل اصلی را بازگو کنید و یک روش حل اشتباه به جایه سوال اصلی نبینید.

mohsen_f_b
جمعه 07 خرداد 1389, 12:03 عصر
سلام
یه فایل ضمیمه رو ببینید.
عکس هم گذاشتم.
ببینید من 4 تا ردیف دارم که در هر ردیف 2 تا TextBox هستش یکی name و دیگری Family.
و اون پایین هم یک دکمه OK!.
من اطلاعات این 4 ردیف رو وارد می کنم و وقتی می خوام دکمه OK! رو زدم برن توی بانک ذخیره بشن.
هر ردیف در اینجا برابر یک رکورد توی بانک باشه.

ricky22
جمعه 07 خرداد 1389, 12:05 عصر
سلام جناب ارژنگ
این دوستمون مشکلش اینه:
مثلا می خواد اگه 4 تا textbox داره با حلقه برنامه خودش تشخیص بده که باید 4 بار insert کنه و این 4 بار متغیر هست و از قبل مشخص نیست و فرمت نامگزاری textbox ها اینطوریه
tx1
tx2
tx3
.
.
.

mohsensaghafi
جمعه 07 خرداد 1389, 15:48 عصر
سلام دوست عزیز.
مشکل شما مشخص نشد، آیا می خواهید تمام این 4 تا رو تو یه درستور insert وارد کنید تا می خواهید به تعدادی که اطلاعات وارد شده insert انجام بشه.
من سعی می کنم هر جفتش رو با هم توضیح بدم.
اول از همه یه کاری بکنید که حتماً ردیف اول پر شود. مثلا تا زمانی که ردیف اول پر نشده است کلید ok بصورت غیر فعال باشد. enable=galse .
حال با توجه به دستور insert زیر دستور کوئری رو کمکم کامل کنید.

INSERT ALL
INTO suppliers (supplier_id, supplier_name) VALUES (1000, 'IBM')
INTO suppliers (supplier_id, supplier_name) VALUES (2000, 'Microsoft')
INTO suppliers (supplier_id, supplier_name) VALUES (3000, 'Google')
SELECT * FROM dual;
اول از همه خط اول وارد کنید. بعد به ازای هر یک از تکست باکس ها یکی از خطوط دوم رو وارد کنید.
و در آخر هم خط آخر رو اضافه کنید.
دستی کد می شود.

String Query="insert all ";
if(text1.txt!="")
Query+="Into table_name (name) values ('"+text1.txt+"')";
if(text2.txt!="")
Query+="Into table_name (name) values ('"+text2.txt+"')";
if(text3.txt!="")
Query+="Into table_name (name) values ('"+text3.txt+"')";
if(text4.txt!="")
Query+="Into table_name (name) values ('"+text4.txt+"')";
Query+="Select * from dual;";

بعد هم کد را برای DBMS ارسال کنید.
یا علی!

mohsen_f_b
جمعه 07 خرداد 1389, 16:02 عصر
INSERT ALL
INTO suppliers (supplier_id, supplier_name) VALUES (1000, 'IBM')
INTO suppliers (supplier_id, supplier_name) VALUES (2000, 'Microsoft')
INTO suppliers (supplier_id, supplier_name) VALUES (3000, 'Google')
SELECT * FROM dual;



دوست عزیز و گرامی باتشکر از راهنمایی شما.
دستور Insert All رو تونستم اجرا کنم با مثالی که شا زدید.
در Query خود SQL هم تست کردم نشد و از All خطا می گیره.

بازهم تشکر

mohsen_f_b
جمعه 07 خرداد 1389, 17:06 عصر
باسلام
با تشکر از دوست عزیز و گرامی ricky22 جان.
با راهنمایی ایشون من تونستم واسه یک فیلد بنویسم.
به شکل زیر.



SqlConnection cn = newSqlConnection("Data Source=.;Initial Catalog=TestCod;Integrated Security=True");
SqlDataAdapter da = newSqlDataAdapter();
DataTable dt = newDataTable();
privatevoid button1_Click(object sender, EventArgs e)
{
foreach (Control ctl in panel1.Controls )
{
if (ctl isTextBox)
if (((TextBox)ctl).Tag == "LName")
{
dt.Clear();
da.SelectCommand = newSqlCommand("Insert Into Table1 (Name) Values ('" + ((TextBox)ctl).Text + "')", cn);
da.Fill(dt);
}
}
}


حالا اگه چندتا فیلد بود چی؟
تو مثالی که گذاشتم 2 فیلد هستش Name و Family.
من توی پروژه اصلی چندتا فیلد دارم که می خوام اینجوزی ثبت بشه.
باتشکر

Open-Source
جمعه 07 خرداد 1389, 21:21 عصر
حالا اگه چندتا فیلد بود چی؟
شما باید از Parameter برای درج چند فیلد استفاده کنید.(این فیلد های یه دفترچه تلفن رو Insert میکنه):

cm.CommandText = "INSERT INTO tblTel (FName,LName,PN,Mobile,Tozih) VALUES (@p1,@p2,@p3,@p4,@p5)";
cm.Parameters.Clear();
cm.Parameters.AddWithValue("@p1", txtFName.Text);
cm.Parameters.AddWithValue("@p2", txtLName.Text);
cm.Parameters.AddWithValue("@p3", txtPN.Text);
cm.Parameters.AddWithValue("@p4", txtMobile.Text);
cm.Parameters.AddWithValue("@p5", txtTozih.Text);



حالا اگه چندتا رکورد بود چی؟
اگر میخوای چند رکورد رو بصورت همزمان درج کنی، باید از Transaction هم استفاده کنی؛ و در آخر اگه همه رکوردهای شما Insert شد بعد Transaction رو Commit کنید در صورت بروز خطا، اونو Rollback کنی (این تعدادی رکورد رو از توی یک Gridمیخونه و توی بانک درج میکنه [ممکنه کد مشکل داشته باشه ولی اصل قضیه همین هستش]):

SqlTransaction trans = New (SqlTransaction);
trans = sConnection.BeginTransaction("يک اسم دلخواه");
cm.Transaction = trans;

try
{
for (int i = 0; i < datagrid.Rows.Count ; i++)
{

cm.CommandText = "INSERT INTO tblTel (FName,LName,PN,Mobile,Tozih) VALUES (@p1,@p2,@p3,@p4,@p5)";
cm.Parameters.Clear();
cm.Parameters.AddWithValue("@p1", datagrid.Rows[i]).Cells[0].Value);
cm.Parameters.AddWithValue("@p2", datagrid.Rows[i].Cells[1].Value);
cm.Parameters.AddWithValue("@p3", datagrid.Rows[i].Cells[2].Value);
cm.Parameters.AddWithValue("@p4", datagrid.Rows[i].Cells[3].Value);
cm.Parameters.AddWithValue("@p5", datagrid.Rows[i].Cells[4].Value);


sCommand.ExecuteNonQuery();
}

trans.Commit();
}
catch
{
trans.Rollback();
}

mohsen_f_b
شنبه 08 خرداد 1389, 10:24 صبح
سلام
باتشکر از جواب شما
من چطوری بهش بگم کدم TextBox رو بخونه؟
به جای datagrid.Rows[i]).Cells[0].Value چی بنویسم؟
شما برای اینکه بگین کدم Rows رو بخونه از for (int i = 0; i < datagrid.Rows.Count ; i++) استفاده کردین این کار بری TextBox نمی شه استفاده کرد!!!
TexBox رو نمی شه اینجوری عددش رو بزاریم textBox[i]؟!!
باتشکر

mohsensaghafi
شنبه 08 خرداد 1389, 15:13 عصر
دوست عزیز و گرامی باتشکر از راهنمایی شما.
دستور Insert All رو تونستم اجرا کنم با مثالی که شا زدید.
در Query خود SQL هم تست کردم نشد و از All خطا می گیره.

بازهم تشکر

سلام دوست عزیز.
کامل دستور رو وارد کردی. با اون select آخر؟!

محمد متاله
شنبه 08 خرداد 1389, 16:29 عصر
سلام دوست عزیر اگر می خواهید که تمامی متن ها را در یک فیلد ذخیره کنید سپس بتوانید آنها را بازیابی کرده و از هم جدا کنید می توانید از این کد استفاده کنید

برای ذخیره متغیر ها در فیلد DATABASE باید کاراکتر جداکننده نیز به آنها اضافه کنید سپس آنها را که به صورت یک رشته هستند در DB و در یک فیلد ذخیره کنید
فرض می کنیم که اطلاعات را از تکست باکس ها خوانده اید و در متغیری به نام myField ذخیره کرده اید
در مثال من چند اسم با دو کارامتر جداکننده در فیلد myFiled وجود دارد که در خط بعد آنها را جدا می کنم ودر یک for آنها را به صورت جدا می خوانم.


البته کد زیر مقداری در این Editor به هم ریخته که نمی دونم چه طور درستش کنم و مثل سوال شما رنگی هم باشه با این حال امیدوارم بتونید اونو بخونید




string myField = "mohammad ali hassan hosein.zahra.fatemeh";
string[] str = myField.Split(new char[] { ' ', '.' });


for (int i = 0; i < str.Length; i++)
{
MessageBox.Show(str[i]);
}

mohsen_f_b
سه شنبه 11 خرداد 1389, 02:01 صبح
سلام دوست عزیز.
کامل دستور رو وارد کردی. با اون select آخر؟!

سلام
بله حتی Select آخر هم زدم.
اگه مثالی در این مورد دارید ممنون می شم اگه بزارید.

باتشکر

mohsensaghafi
سه شنبه 11 خرداد 1389, 13:59 عصر
سلام
بله حتی Select آخر هم زدم.
اگه مثالی در این مورد دارید ممنون می شم اگه بزارید.

باتشکر

سلام دوست عزیز.
کدی رو که نوشتی بزار تا چکش کنیم.

sds1920
سه شنبه 11 خرداد 1389, 15:50 عصر
سلام دوست عزیز.
مشکل شما مشخص نشد، آیا می خواهید تمام این 4 تا رو تو یه درستور insert وارد کنید تا می خواهید به تعدادی که اطلاعات وارد شده insert انجام بشه.
من سعی می کنم هر جفتش رو با هم توضیح بدم.
اول از همه یه کاری بکنید که حتماً ردیف اول پر شود. مثلا تا زمانی که ردیف اول پر نشده است کلید ok بصورت غیر فعال باشد. enable=galse .
حال با توجه به دستور insert زیر دستور کوئری رو کمکم کامل کنید.

INSERT ALL
INTO suppliers (supplier_id, supplier_name) VALUES (1000, 'IBM')
INTO suppliers (supplier_id, supplier_name) VALUES (2000, 'Microsoft')
INTO suppliers (supplier_id, supplier_name) VALUES (3000, 'Google')
SELECT * FROM dual;
اول از همه خط اول وارد کنید. بعد به ازای هر یک از تکست باکس ها یکی از خطوط دوم رو وارد کنید.
و در آخر هم خط آخر رو اضافه کنید.
دستی کد می شود.

String Query="insert all ";
if(text1.txt!="")
Query+="Into table_name (name) values ('"+text1.txt+"')";
if(text2.txt!="")
Query+="Into table_name (name) values ('"+text2.txt+"')";
if(text3.txt!="")
Query+="Into table_name (name) values ('"+text3.txt+"')";
if(text4.txt!="")
Query+="Into table_name (name) values ('"+text4.txt+"')";
Query+="Select * from dual;";

بعد هم کد را برای DBMS ارسال کنید.
یا علی!

خيلي ممنون دوست عزيز.خيلي وقت بود دنبال همچين كدي مي گشتم.ولي مي خواستم بپرسم عبارت Select * from dual آخر دستور براي چيه؟اصلا چه كاري مي كنه؟
يه سوال ديگه اينكه سرعت اين كار بيشتر يا اينكه توي يه حلقه ي for از يك دستور insert استفاده بشه ولي مقادير پارامتراش عوض بشه؟
ممنون.

mohsensaghafi
چهارشنبه 12 خرداد 1389, 09:47 صبح
خيلي ممنون دوست عزيز.خيلي وقت بود دنبال همچين كدي مي گشتم.ولي مي خواستم بپرسم عبارت Select * from dual آخر دستور براي چيه؟اصلا چه كاري مي كنه؟
يه سوال ديگه اينكه سرعت اين كار بيشتر يا اينكه توي يه حلقه ي for از يك دستور insert استفاده بشه ولي مقادير پارامتراش عوض بشه؟
ممنون.

سلام دوست عزیز.
بعد از دستور Insert All حتما باید یک کوئری گرفته شود. حالا این کوئری هر چیزی می تواند باشد. شاید الزام وجود یک کوئری دیگر برای نشان دادن پایان دستور Insert All باشد. این رو نمی دونم.
شما می توانید هر کوئری یی استفاده کنید.
قطعا این روش موثر تری است. چون در این روش فقط یک بار برنامه به دیتابیس وصل می شود اما در اون روشی که گفتید به تعداد رکورد هایی که می خواهند وارد دیتابیس شوند باید ارتباط با دیتابیس وصل شود و سپس اطلاعات ارسال شود.