PDA

View Full Version : سوال: مشکل در پر کردن دیتا ست



mohammad_2039
سه شنبه 09 فروردین 1390, 23:32 عصر
با سلام و تبریک سال نو به همه دوستان
من دو تا تکس باکس دارم که تو هر کدوم چند تا عنوان نوشته میشه که با( ، )از هم جدا میشه با استفاده از متد Split مربوط به آرایه ای از نوع استرینگ این عنوان ها رو از هم جدا میکنم. حالا طبق کد زیر میخوام یه دستور select بنویسم و دیتا ست رو پر کنم. اما ظاهرا دیتا ست پر نمیشه چون نمیتونم اطلاعاتش رو تو دیتا گرید نمایش بدم. اگه ممکنه کد زیر رو ببینید و راهنماییم کنید





string a1 = textBox1.Text;
string[] record1 = a1.Split(',');
string a2 = textBox2.Text;
string[] record2 = a2.Split(',');
DataSet dset = new DataSet();
for (int i = 0; i < record1.Length; i++)
{
string mozo = "";
SqlCommand cmd = new SqlCommand("select distinct mozo from tbl_test where number='" + record1[i] + "'", sqlConnection1);
sqlConnection1.Open();
SqlDataReader r = cmd.ExecuteReader();
while (r.Read())
{

mozo=(r["mozo"].ToString());

string b = string.Format(@"Select * from tbl_test where number='{0}' and mozo='{1}'",record1[i], mozo);
SqlDataAdapter madapt = new SqlDataAdapter(b, sqlConnection2);
madapt.Fill(dset,"tbl_test");

}
cmd.Dispose();
r.Close();
sqlConnection1.Close();


}

ehsanara
چهارشنبه 10 فروردین 1390, 00:34 صبح
where number='" + record1[i] + "'"
Number فقط یک کاراکتر باید بگیره؟ یا رشته میگیره؟

mohammad_2039
چهارشنبه 10 فروردین 1390, 07:44 صبح
رشته میگیره . در واقع این رشته ها تو خونه های آرایه اول قرار دارن دیگه. اگه number با یکی از این رشته ها برابر بود میره از جدول رکورد مورد نظر رو پیدا میکنه. تا اینجا مشکلی نداره مشکل تو پر شدن دیتا ست و نمایش رکورد های مورد نظره ؟؟

exlord
چهارشنبه 10 فروردین 1390, 09:35 صبح
1 - نوع فیلد number چیه ؟ عدد یا رشته ؟
2 - ساختار tbl_test چجوریه ؟
3 - query اول یه ستون برمیگردونه ؟
4 - query دوم یه table برمیگردونه یا یه سطر ؟

اگه همه ی query ها دیتاشونو درست برمیگردونن قسمت دوم رو اینجوری اصلاح کن ...

1 - از DataTable به جای DataSet استفاده کن ... چون فقط به یه Table احتیاج داری ...
DataTable dt = new DataTable();
2 - هربار که یه DataTable رو Fill میکنی ... اطلاعات قبلی از بین میره واطلاعات جدید ذخیره میشن ...
DataTable tempDt = new DataTable();
madapt.Fill(tempDt);
foreach (DataRow row in tempDt.Rows)
{
dt.Rows.Add(row);
}

mohammad_2039
چهارشنبه 10 فروردین 1390, 21:16 عصر
دوستان کسی پیشنهادی نداره ؟

asif1358
چهارشنبه 10 فروردین 1390, 22:25 عصر
سلام
شما باید پیش از ایجاد SqlCommand کانکشن را باز کنید؛ فکر کنم ارور مربوط به این قسمت است.

shadi khanum
پنج شنبه 11 فروردین 1390, 00:22 صبح
احتمالا کدتون یه جایی به Errorمیخوره و اصلا fill نمیشه.واسه اینکه ببینی کجاست و error دقیقا از کجاست try و Catch بذار که متن error رو بده.
اگه این کارهارو کردی و جواب نداده واسه trace بهتر برنامت سر اون دستور fill، یه breakpoint بذار و قبل از اینکه با برنامه fill بشه، دستور Select که تولید کردی رو دستی روی دیتابیس اجرا کن و ببین آیا واقعا خروجی داره یا نه؟

navidkhalilian
پنج شنبه 11 فروردین 1390, 01:30 صبح
من که این تیکه کد را دیدم وحشت کردم.فکر کنم اگه واضح بگی می خوای چیکار کنی تا ما یه تیکه کد خوب برات بنویسیم خیلی بهتره.

mohammad_2039
پنج شنبه 11 فروردین 1390, 07:49 صبح
احتمالا کدتون یه جایی به Errorمیخوره و اصلا fill نمیشه.واسه اینکه ببینی کجاست و error دقیقا از کجاست try و Catch بذار که متن error رو بده.
اگه این کارهارو کردی و جواب نداده واسه trace بهتر برنامت سر اون دستور fill، یه breakpoint بذار و قبل از اینکه با برنامه fill بشه، دستور Select که تولید کردی رو دستی روی دیتابیس اجرا کن و ببین آیا واقعا خروجی داره یا نه؟


راستش این کار هارو انجام دادم خطا نداره فقط نمیدونم چرا دیتا ست پر نمیشه ؟ و در ضمن کنترل کردم متوجه شدم فقط یک با وارد حلقه while میشه و به ازای مقادیر بعدی در for دیگه وارد حلقه while نمیشه.


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


شاید حق با شما باشه، راستش من اونجا یه بخشی از برنامه رو توضیح دادم که شاید کامل نبوده. من به یه کمبو باکس نیاز داشتم که بشه از توش چند تا مورد رو همزمان انتخاب کرد بنابر این از کامپوننت DevExpress استفاده کردم یه شی به نام ChekedComboListBox داره که این کار رو انجام میده. tbl_test در حدود 10 تا فیلد داره (Id,number,mozo,name,...) که به جز id بقیه رشته هستن البته id رو نمیخوام نمایش بدم. من number ها (مثل شماره1، شماره2،..) رو میخونم تو کمبو اول. بعد از بین اونها هر چند تا که بخوام تیک میزنم و بعد از ok کردن روی کمبو نمایش داده میشن در حالی که با ویرگول از هم جدا شدن . بعد تو یه حلقه با کمک همون متد split میگم که بره و mozo های مربوط به اون number ها رو از tbl_test انتخاب کنه و در کمبو دوم نمایش بده (تا اینجا مشکلی نیست). حالا باید از کمبو دوم هرچند تا موضوع که میخوام انتخاب کنم (که اونها هم در کمبو با ویرگول جدا میشه) و حالا میخوام دکمه گزارش رو بزنم ، الان باید Query من اینطوری بشه : بره از tbl_test تمام رکوردهایی که mozo اونها برابر کمبو دوم و number اونها برابر کمبو اول هست رو انتخاب کنه و یکی یکی تو دیتا ست (که از نوع TypeDataset هست و چند تا جدول دیگه هم بهش اضافه کردم) پر بشه. وبعد اون دیتا ست رو پاس بدم به کریستال. حالا نمیدونم راه رو درست رفتم یا نه ؟ تو حلقه for با توجه به record1[i] موضوع های هر number رو انتخاب کردم و در حلقه while رکورد های مورد نظر رو با شرطی که گذاشتم یکی یکی به دیتا ست اضافه کردم.
ممنون میشم اگه نظرتون رو بگید. باتشکر

slashslash2009
پنج شنبه 11 فروردین 1390, 12:40 عصر
ولی اگه از دیتا تیبل استفاده کنی خیلی بهتره یکی از دوستان هم پیشنهاد داده بود
SqlCommand cmd2 = new SqlCommand("Select name from table1 where name =@nm", con);
SqlDataAdapter da2 = new SqlDataAdapter(cmd2);
da2.SelectCommand.Parameters.Add("@nm", SqlDbType.Char).Value = textBox1.Text;
DataTable dt2 = new DataTable();
da2.Fill(dt2);
dataGridView1.DataSource = dt2;

mohammad_2039
پنج شنبه 11 فروردین 1390, 13:01 عصر
ولی اگه از دیتا تیبل استفاده کنی خیلی بهتره یکی از دوستان هم پیشنهاد داده بود
SqlCommand cmd2 = new SqlCommand("Select name from table1 where name =@nm", con);
SqlDataAdapter da2 = new SqlDataAdapter(cmd2);
da2.SelectCommand.Parameters.Add("@nm", SqlDbType.Char).Value = textBox1.Text;
DataTable dt2 = new DataTable();
da2.Fill(dt2);
dataGridView1.DataSource = dt2;

با تشکر از شما
بله درست میفرمایید اما مشکل اینجاست که دیتا تیبل هر بار که برنامه وارد حلقه میشه اطلاعات قبلی پاک میشه و تیبل جدید درست میکنه در حالی که تو این کد هر بار که وارد حلقه while میشه باید چند بار تو این حلقه بچرخه و هر بار چند سطر اضافه کنه و دوباره به حلقه for بره و مقدار i بعدی رو قرار بده و الی آخر که با این شرایط نتونستم از دیتا تیبل استفاده کنم، بعد این یک typeDataset هست که چند تا تیبل دیگه هم توش اضافه کردم که باید پاس بدم به کریستال و ازش گزارش بگیرم. حالا اگه کلا راه حل دیگه ای برای حل این مشکل که در بالا کامل از اول توضیح دادم دارید خوشحال میشم راهنماییم کنید.
با تشکر