PDA

View Full Version : سوال: مشکل با کد جستجو



MINA B
سه شنبه 28 مرداد 1393, 00:15 صبح
سلام دوستان یه کد جستجو نوشتم اما کار نمی کنه شایدم اشتباه هست از between هم استفاده کردم کار نکرد این کد از یک ویو جستجو می کند شاید نحوه استفاده از ویو تو سی شارپ فرق می کنه نمی دونم اینم کد و عکس فرم

public DataTable Search_Allmelk(string k,string t,string m,string me,string g,string gh,string e,string ej) {
this.Open();
DataTable dt = new DataTable();
string sql = "select [Codemelk],[Typemelk],[Karbari],[Metraj],[Tedadkhab],[Tedadtabaghat],[Gheymatkol],[Gheymatejareh],[Address],[Vazeiat],[Name],[Family] from mema where Karbari=@k AND Typemelk=@t AND (Metraj<@me) AND (Metraj>@m) AND (Gheymatkol<@gh) AND (Gheymatkol>@g) AND (Gheymatejareh<@ej) AND (Gheymatejareh>@e) ";
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@k",k);
cmd.Parameters.AddWithValue("@t",t);
cmd.Parameters.AddWithValue("@m",m);
cmd.Parameters.AddWithValue("@me",me);
cmd.Parameters.AddWithValue("@g",g);
cmd.Parameters.AddWithValue("@gh",gh);
cmd.Parameters.AddWithValue("@e",e);
cmd.Parameters.AddWithValue("@ej",ej);
dt.Clear();
daa.Fill(dt);
cmd.Parameters.Clear();
this.Close();
return dt;




}
http://8pic.ir/images/ihv0opvgrnrsnt2xseae.png
ممنون میشم راهنمایی بفرمایید.

_4rm4n_
سه شنبه 28 مرداد 1393, 00:26 صبح
سلام
قبل همه چی یک پیشنهاد دوستانه بهتون میکنم !
اسم متغیر هارو درست انتخاب کنید ! اینجوری 1 ماه دیگه که به پروژه برمیگردید میفهمید چیکار کردید !
خب اما کدتون.
چرا این همه راه میرین ؟!!
شما یک دیتا گرید ویو دارید دیگه !
چند تا آیتم ثابت هستند مثلا کد ملک همیشه برای هر آیتمی ثابت هست!
خب میایم از همین کد ملک استفاده میکنیم !
یا یک دستور select میایم کل row که مقدار [Codemelk] برابر هست با مقداری که کاربر وارد کرده رو میگیریم و همونو توی یک data table میریزیم و نمایش میدیم !
کدتون رو بر این اساس بنویسین و اون اضافی هارو هم پاک کنید ! اسم متغیر هاتون رو هم درست کنید هم کدتونو خلوت تر میشه هم خوانا تر میشه !
موفق باشید.

MINA B
سه شنبه 28 مرداد 1393, 00:50 صبح
سلام
قبل همه چی یک پیشنهاد دوستانه بهتون میکنم !
اسم متغیر هارو درست انتخاب کنید ! اینجوری 1 ماه دیگه که به پروژه برمیگردید میفهمید چیکار کردید !
خب اما کدتون.
چرا این همه راه میرین ؟!!
شما یک دیتا گرید ویو دارید دیگه !
چند تا آیتم ثابت هستند مثلا کد ملک همیشه برای هر آیتمی ثابت هست!
خب میایم از همین کد ملک استفاده میکنیم !
یا یک دستور select میایم کل row که مقدار [Codemelk] برابر هست با مقداری که کاربر وارد کرده رو میگیریم و همونو توی یک data table میریزیم و نمایش میدیم !
کدتون رو بر این اساس بنویسین و اون اضافی هارو هم پاک کنید ! اسم متغیر هاتون رو هم درست کنید هم کدتونو خلوت تر میشه هم خوانا تر میشه !
موفق باشید.
راستش به علت کمبود وقت فقط حروف اول دوم رو گرفتم.ایشاالله از پروژه بعدی.
منظورتون رو متوجه نمی شم.منظورتون اینه که کاربر کد ملک رو وارد کنه؟ اینجا من یه گرید ویو دارم که توی لود فرم گفتم همه ی اطلاعات رو از ویو بیاره حالا کاربر یه سری اطلاعات رو وارد می کنه تو گروپ باکس جستجو و بر اساس اون اطلاعات من کد بالا رو پشت دکمه جستجو فراخوانی می کنم و دوباره تو گرید ویو می ریزم.

alibilgats
سه شنبه 28 مرداد 1393, 21:25 عصر
دوست خوبم با این کدی که شما نوشتی کاربر باید همه گزینه ها رو وارد کنه تا جستجو نتیجه بده چون از AND استفاده کردی!
شما باید کنترلت رو بیشتر کنی! باید بیای بگی هر کدوم از گزینه ها رو که کاربر تکمیل کرد با همدیگه AND بشن! وگرنه توی select نباید بیان.
یا اینکه از OR استفاده بکنی که در اینصورت نتیجه همه حالت ها رو برات میاره که چیز جالبی نمیشه!
اگه نتونستی بگو برات کدتو تصحیح میکنم.

MINA B
پنج شنبه 30 مرداد 1393, 00:47 صبح
دوست خوبم با این کدی که شما نوشتی کاربر باید همه گزینه ها رو وارد کنه تا جستجو نتیجه بده چون از AND استفاده کردی!
شما باید کنترلت رو بیشتر کنی! باید بیای بگی هر کدوم از گزینه ها رو که کاربر تکمیل کرد با همدیگه AND بشن! وگرنه توی select نباید بیان.
یا اینکه از OR استفاده بکنی که در اینصورت نتیجه همه حالت ها رو برات میاره که چیز جالبی نمیشه!
اگه نتونستی بگو برات کدتو تصحیح میکنم.
بله شرط هم گذاشتم که همه ی کادر ها پر باشن.اما جدا از این کلا کد درست کار نمی کنه!

alibilgats
پنج شنبه 30 مرداد 1393, 09:53 صبح
فیلدهای کاربری و نوع ملک رو کدبندی کردی یا همون مقادیرش رو سرچ میزنی؟
مثلا کلمه 'تجاری' رو توی بانک سرچ میزنی یا کدش رو؟
اگه مستقیما حروف فارسی رو سرچ میزنی احتمال داره مشکل از اینکار باشه!
ولی اصول کار اینه که شما کد بندی بکنی. واگر توی یه select با پارامترهای زیاد به مشکل این چنینی برخورد کردی باید تک تک پارامتر هاتو اول بصورت جدا چک کنی تا ببینی کدومشون مشکل داره!
اگه از حروف فارسی استفاده کردی این تغییر رو هم توی کدت اعمال کن ببین جواب میده یا نه! خودم تست نزدم





cmd.Parameters.AddWithValue("@k","N'" + k + "'");
cmd.Parameters.AddWithValue("@t","N'" + t + "'");

veniz2008
پنج شنبه 30 مرداد 1393, 09:54 صبح
سلام.
به گونه ای کد بنویسید که از کدنویسی لذت ببرید. اینکه در یک متد هرچی دم دستمون میاد رو بنویسیم که چاره کار نمیشه.
شما کانکشن رو به command، بایند نکردید.
معمولا جستجو براساس فیلدهای محدودی مثل کلید جدول یا فیلدهای کاربردی صورت میگیره و کمتر از این همه فیلد استفاده میشه ولی شاید واقعا نیاز داشتید که این همه شرط رو AND کردید!!.
یا از این کد استفاده کنید :

public DataTable Search_Allmelk(string k,string t,string m,string me,string g,string gh,string e,string ej)
{
SqlDataAdapter da = new SqlDataAdapter("select [Codemelk],[Typemelk],[Karbari],[Metraj],[Tedadkhab],[Tedadtabaghat],[Gheymatkol],[Gheymatejareh],[Address],[Vazeiat],[Name],[Family] from mema where Karbari=@k AND Typemelk=@t AND (Metraj<@me) AND (Metraj>@m) AND (Gheymatkol<@gh) AND (Gheymatkol>@g) AND (Gheymatejareh<@ej) AND (Gheymatejareh>@e)",con);
DataTable dt = new DataTable();
da.SelectCommand.Parameters.AddWithValue("@k",k);
da.SelectCommand.Parameters.AddWithValue("@t",t);
da.SelectCommand.Parameters.AddWithValue("@m",m);
da.SelectCommand.Parameters.AddWithValue("@me",me);
da.SelectCommand.Parameters.AddWithValue("@g",g);
da.SelectCommand.Parameters.AddWithValue("@gh",gh);
da.SelectCommand.Parameters.AddWithValue("@e",e);
da.SelectCommand.Parameters.AddWithValue("@ej",ej);
da.Fill(dt);
return dt;
}
یا از این کد :

public DataTable Search_Allmelk(string k,string t,string m,string me,string g,string gh,string e,string ej)
{
SqlCommand cmd = new SqlCommand("select [Codemelk],[Typemelk],[Karbari],[Metraj],[Tedadkhab],[Tedadtabaghat],[Gheymatkol],[Gheymatejareh],[Address],[Vazeiat],[Name],[Family] from mema where Karbari=@k AND Typemelk=@t AND (Metraj<@me) AND (Metraj>@m) AND (Gheymatkol<@gh) AND (Gheymatkol>@g) AND (Gheymatejareh<@ej) AND (Gheymatejareh>@e)",con);

cmd.Parameters.AddWithValue("@k",k);
cmd.Parameters.AddWithValue("@t",t);
cmd.Parameters.AddWithValue("@m",m);
cmd.Parameters.AddWithValue("@me",me);
cmd.Parameters.AddWithValue("@g",g);
cmd.Parameters.AddWithValue("@gh",gh);
cmd.Parameters.AddWithValue("@e",e);
cmd.Parameters.AddWithValue("@ej",ej);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
اگر جوابی برگشت داده نشد، درون جدولتون چنین جوابی با این شروط وجود نداره. پس به این مورد خوب دقت کنید.
موفق باشید.

MINA B
پنج شنبه 30 مرداد 1393, 21:53 عصر
سلام.من برنامه رو دوباره تست کردم اگه مبدا یعنی اونجا که میگم از مثلا 1 رو, عدد 0 قرار بدم برنامه جواب میده اما اگه هر عدد دیگه ای بذارم جواب نمیده یکی دوبارم شانسی جواب داد اما بعد دیگه درست نشد:ناراحت:

veniz2008
پنج شنبه 30 مرداد 1393, 23:54 عصر
سلام.من برنامه رو دوباره تست کردم اگه مبدا یعنی اونجا که میگم از مثلا 1 رو, عدد 0 قرار بدم برنامه جواب میده اما اگه هر عدد دیگه ای بذارم جواب نمیده یکی دوبارم شانسی جواب داد اما بعد دیگه درست نشد:ناراحت:
مبدا دیگه چیه؟؟؟؟؟؟؟؟؟؟؟
یه کاری کنید :
یه عکس از محتویات جدولتون بگیرید و بذارید،
یه عکس هم از مقادیری که در فرم برنامتون وارد می کنید و جوابی برگشت داده نمیشه، بگیرید و بذارید.
چون با این توضیحاتی که شما می دید هیچ کمکی نمیشه کرد، شکل هایی که میزارید بهتر میتونن کمک کنن.

MINA B
جمعه 31 مرداد 1393, 14:17 عصر
مبدا دیگه چیه؟؟؟؟؟؟؟؟؟؟؟
یه کاری کنید :
یه عکس از محتویات جدولتون بگیرید و بذارید،
یه عکس هم از مقادیری که در فرم برنامتون وارد می کنید و جوابی برگشت داده نمیشه، بگیرید و بذارید.
چون با این توضیحاتی که شما می دید هیچ کمکی نمیشه کرد، شکل هایی که میزارید بهتر میتونن کمک کنن.
این عکس داده ها رو قبل از جستجو نشون میده فرض کنید من میخوام ملکی که کاربری تجاری و نوع ویلایی دارد را جسجو کنم
http://8pic.ir/images/l6svoeedmbtthrjm9uvd.png
این عکس بعد از جستجو هست و مقادیر هم که در کادر های مربوطه وارد کردم
http://8pic.ir/images/7i9c2tn5jlbyz13xh1ll.png
و نتیجه ای نداره
اما تو این عکس وقتی کادر های اول یعنی اونجا که میگم از رو 0 قرار دادم و نتیجه جستجو درسته
http://8pic.ir/images/yw8bcltnb026bmvbowze.png

alibilgats
جمعه 31 مرداد 1393, 15:07 عصر
دوست عزیز از between استفاده کن ببین درست میشه یا نه

MINA B
جمعه 31 مرداد 1393, 15:11 عصر
دوست عزیز از between استفاده کن ببین درست میشه یا نه
اتفاقا اولش از between استفاده کردم اما جواب نداد بعد اینطوری نوشتم اما حالا یه بار دیگم امتحان می کنم.میام میگم.

MINA B
جمعه 31 مرداد 1393, 15:18 عصر
با between هم دقیقا همون اتفاق افتاد وقتی 0 هست میاره وقتی نیست نه:گریه:

veniz2008
جمعه 31 مرداد 1393, 15:59 عصر
این عکس داده ها رو قبل از جستجو نشون میده فرض کنید من میخوام ملکی که کاربری تجاری و نوع ویلایی دارد را جسجو کنم
http://8pic.ir/images/l6svoeedmbtthrjm9uvd.png
این عکس بعد از جستجو هست و مقادیر هم که در کادر های مربوطه وارد کردم
http://8pic.ir/images/7i9c2tn5jlbyz13xh1ll.png
و نتیجه ای نداره
اما تو این عکس وقتی کادر های اول یعنی اونجا که میگم از رو 0 قرار دادم و نتیجه جستجو درسته
http://8pic.ir/images/yw8bcltnb026bmvbowze.png
مشکل بخاطر استفاده از NULL در ستون های عددی جدولتون هست. در واقع sql در زمان برخورد با NULL هیچ درکی از این مقدار نداره (اشتباه تصور نکنید که NULL رو با 0 یکی میگیره یا NULL رو با رشته خالی یکسان فرض میکنه). به همین خاطر هست که خیلی از برنامه نویسان تا حد امکان از NULL دوری میکنن و در صورت خالی بودن اون فیلد یک مقدار پیش فرض و قراردادی رو به جای NULL درج میکنن. برای رفع مشکلتون از تابع ISNULL در sql استفاده کنید و یک مقدار دلخواه (مثلا 0 ) رو به جای NULL در کوئری در نظر بگیرید. تابع ISNULL رو برای هر فیلدی که امکان NULL بودن داره و در جستجو دخالت داره، قرار بدید (مثل شکل زیر).
توجه کنید که این مقدار 0 فقط در زمان کوئری گرفتن لحاظ میشه و درون جدولتون به جای NULL هایی که دارید درج نمیشه) :
122537

MINA B
جمعه 31 مرداد 1393, 16:48 عصر
مشکل بخاطر استفاده از NULL در ستون های عددی جدولتون هست. در واقع sql در زمان برخورد با NULL هیچ درکی از این مقدار نداره (اشتباه تصور نکنید که NULL رو با 0 یکی میگیره یا NULL رو با رشته خالی یکسان فرض میکنه). به همین خاطر هست که خیلی از برنامه نویسان تا حد امکان از NULL دوری میکنن و در صورت خالی بودن اون فیلد یک مقدار پیش فرض و قراردادی رو به جای NULL درج میکنن. برای رفع مشکلتون از تابع ISNULL در sql استفاده کنید و یک مقدار دلخواه (مثلا 0 ) رو به جای NULL در کوئری در نظر بگیرید. تابع ISNULL رو برای هر فیلدی که امکان NULL بودن داره و در جستجو دخالت داره، قرار بدید (مثل شکل زیر).
توجه کنید که این مقدار 0 فقط در زمان کوئری گرفتن لحاظ میشه و درون جدولتون به جای NULL هایی که دارید درج نمیشه) :
122537
الان با خوشحالی رفتم کدی که شما فرستادین رو نوشتم گفتم این دفعه دیگه درست میشه اماااااااااااااا باز همونطوری شد:متعجب::عصبانی++:جالبه برنامه به ازای جایگشت های خاصی از 0 و 1 و 2 در کادرهای اول قیمت اجاره و قیمت کل جواب میده .فک میکنم کلا باید این مدل نوشتن رو فراموش کنم.شرمنده که به همه شما هم زحمت دادم :ناراحت:

veniz2008
جمعه 31 مرداد 1393, 17:36 عصر
الان با خوشحالی رفتم کدی که شما فرستادین رو نوشتم گفتم این دفعه دیگه درست میشه اماااااااااااااا باز همونطوری شد:متعجب::عصبانی++:جالبه برنامه به ازای جایگشت های خاصی از 0 و 1 و 2 در کادرهای اول قیمت اجاره و قیمت کل جواب میده .فک میکنم کلا باید این مدل نوشتن رو فراموش کنم.شرمنده که به همه شما هم زحمت دادم :ناراحت:
شما کدی رو که در شکل گذاشته بودم، سمت sql server و درون یک کوئری بنویسید و اجرا کنید (دقیقا مثل همین چیزی که من نوشتم). اگر بدون مشکل خروجی رو بهتون نشون داد، مشخص میشه که ایراد شما در سمت #C هستش.
کد رو براتون میذارم، کپی و paste کنید تا اشتباه تایپ نکنید (بالای پنجره SQL Server Management Studio عبارت New Query رو می تونید پیدا کنید) :

select * from mema where Karbari= N'تجاری' AND Typemelk = N'ویلایی' AND (Metraj< 2000) AND (Metraj> 3) AND
(Gheymatkol< 900000000) AND (Gheymatkol> 100) AND (ISNULL(Gheymatejareh,0)<= 88888) AND (ISNULL(Gheymatejareh,0)>= 3)

MINA B
جمعه 31 مرداد 1393, 18:07 عصر
شما کدی رو که در شکل گذاشته بودم، سمت sql server و درون یک کوئری بنویسید و اجرا کنید (دقیقا مثل همین چیزی که من نوشتم). اگر بدون مشکل خروجی رو بهتون نشون داد، مشخص میشه که ایراد شما در سمت #C هستش.
کد رو براتون میذارم، کپی و paste کنید تا اشتباه تایپ نکنید (بالای پنجره SQL Server Management Studio عبارت New Query رو می تونید پیدا کنید) :

select * from mema where Karbari= N'تجاری' AND Typemelk = N'ویلایی' AND (Metraj< 2000) AND (Metraj> 3) AND
(Gheymatkol< 900000000) AND (Gheymatkol> 100) AND (ISNULL(Gheymatejareh,0)<= 88888) AND (ISNULL(Gheymatejareh,0)>= 3)
اینجا لطف می کنه و یه دونشون رو برمی گردونه و دوباره وقتی 0 میذارم نتایج درست رو برمی گردونه!

aminmousavi
جمعه 31 مرداد 1393, 18:40 عصر
سلام ، دوست عزیز ، فکر کنم مشکلتون رو متوجه شدم.
احتمالا شما DataType فیلد های قیمت کل ، قیمت اجرا و متراژ رو رشته ای (nvarchar یا ...) در نظر گرفتید ، بخاطر DataType شما هست مشکلتون ، دو تا راه حل دارید :
1- از دیتابیس DataType رو تغییر بدید
2- موقع Select زدن از C# مقدار اون فیلد ها رو Cast کنین

اگر روش دوم رو میخواهید برید از کد زیر استفاده کنین :


DA.SelectCommand.CommandText = "select [Codemelk],[Typemelk],[Karbari],[Metraj],[Tedadkhab],[Tedadtabaghat],[Gheymatkol],[Gheymatejareh],[Address],[Vazeiat],[Name],[Family] from mema where Karbari=@karbar AND Typemelk=@typemelk AND (((CONVERT(BIGINT, Metraj) < @HighMetraj ) AND ( CONVERT(BIGINT, Metraj) > @lowMetraj)) OR Metraj IS NULL) AND (((CONVERT(BIGINT, Gheymatkol) < @HighGheymat) AND (CONVERT(BIGINT, Gheymatkol) > @LowGheymat)) OR Gheymatkol IS NULL) AND (((CONVERT(BIGINT, Gheymatejareh) < @HighEjare) AND (CONVERT(BIGINT, Gheymatejareh) > @LowEjrae)) OR Gheymatejareh IS NULL) ";

veniz2008
جمعه 31 مرداد 1393, 19:13 عصر
اینجا لطف می کنه و یه دونشون رو برمی گردونه و دوباره وقتی 0 میذارم نتایج درست رو برمی گردونه!
خوب درسته دیگه. مشکلی نداره.
برای شرط Gheymatejareh >= 0 باید 2 رکورد بیاره (رکوردهای 48 و 49) چون NULL رو با تابع ISNULL به 0 تبدیل کردیم و رکورد با CodeMelk = 48 هم درون شرط صدق میکنه ولی اگر شرط رو با Gheymatejareh >= 3 قرار بدیم، فقط شماره 49 درون شرط صدق میکنه و باید 1 رکورد برگردونه.
منم کدی رو که براتون گذاشتم که تست کنید با Gheymatejareh >= 3 قرار داده بودم.
حالا همین کوئری رو درون کدهای سی شارپتون قرار بدید و مقادیر صحیح رو براش ست کنید. نیازی به حرف N هم ندارید چون از پارامترها استفاده می کنید.
دقت کنید که پارامترهای ورودی متد رو در جای صحیح خودشون قرار بدید و اگر از نام های مناسب استفاده کنید، کار خودتون رو راحت تر می کنید.
موفق باشید.

MINA B
جمعه 31 مرداد 1393, 21:40 عصر
سلام ، دوست عزیز ، فکر کنم مشکلتون رو متوجه شدم.
احتمالا شما DataType فیلد های قیمت کل ، قیمت اجرا و متراژ رو رشته ای (nvarchar یا ...) در نظر گرفتید ، بخاطر DataType شما هست مشکلتون ، دو تا راه حل دارید :
1- از دیتابیس DataType رو تغییر بدید
2- موقع Select زدن از C#‎ مقدار اون فیلد ها رو Cast کنین

اگر روش دوم رو میخواهید برید از کد زیر استفاده کنین :


DA.SelectCommand.CommandText = "select [Codemelk],[Typemelk],[Karbari],[Metraj],[Tedadkhab],[Tedadtabaghat],[Gheymatkol],[Gheymatejareh],[Address],[Vazeiat],[Name],[Family] from mema where Karbari=@karbar AND Typemelk=@typemelk AND (((CONVERT(BIGINT, Metraj) < @HighMetraj ) AND ( CONVERT(BIGINT, Metraj) > @lowMetraj)) OR Metraj IS NULL) AND (((CONVERT(BIGINT, Gheymatkol) < @HighGheymat) AND (CONVERT(BIGINT, Gheymatkol) > @LowGheymat)) OR Gheymatkol IS NULL) AND (((CONVERT(BIGINT, Gheymatejareh) < @HighEjare) AND (CONVERT(BIGINT, Gheymatejareh) > @LowEjrae)) OR Gheymatejareh IS NULL) ";

سلام.یک دنیا ممنون .مشکل با استفاده از روش دومی که فرمودین حل شد. خیلی خیلی ممنونم که وقت گذاشتید.

MINA B
جمعه 31 مرداد 1393, 21:46 عصر
خوب درسته دیگه. مشکلی نداره.
برای شرط Gheymatejareh >= 0 باید 2 رکورد بیاره (رکوردهای 48 و 49) چون NULL رو با تابع ISNULL به 0 تبدیل کردیم و رکورد با CodeMelk = 48 هم درون شرط صدق میکنه ولی اگر شرط رو با Gheymatejareh >= 3 قرار بدیم، فقط شماره 49 درون شرط صدق میکنه و باید 1 رکورد برگردونه.
منم کدی رو که براتون گذاشتم که تست کنید با Gheymatejareh >= 3 قرار داده بودم.
حالا همین کوئری رو درون کدهای سی شارپتون قرار بدید و مقادیر صحیح رو براش ست کنید. نیازی به حرف N هم ندارید چون از پارامترها استفاده می کنید.
دقت کنید که پارامترهای ورودی متد رو در جای صحیح خودشون قرار بدید و اگر از نام های مناسب استفاده کنید، کار خودتون رو راحت تر می کنید.
موفق باشید.
بله دوست عزیز حق با شما بود مشکل از سمت دیتا بیس نبود من کوئری رو با مقادیری که null نبود تست کردم و جواب داد مشکل از سمت سی شارپ بود و با استفاده از راه حل آقای aminmousavi مشکل حل شد.از شما هم واقعا ممنونم که وقت گذاشتید.