PDA

View Full Version : مبتدی: کد سرچ شلوغ



sadeghx98
یک شنبه 24 شهریور 1392, 17:51 عصر
سلام
من این کد هارو برای انجام جستجو یی خیلی راحت در برای مثال یک فرم اعضا در نظر گرفتم که کاربر وقتی یک یا چند تکست باکس رو پر میکنه جستجو ها به راحتی بهش نشون داده شه
من این تابع رو تعریف کردم و با هر بار که یکی از تکست باکس هام تغییر میکنه این تابع فرا خونی میشه
public void serch()
{


if (txtmname.Text == "" && txtmfamily.Text == "" && txtmdate.Text == "" && txtmparent.Text == "")
{
cmstr = "SELECT * FROM Member";
s1 = 0;
s2 = 0;
s3 = 0;
s4 = 0;
}
else
{
cmstr = cmstr + " WHERE";

if (txtmname.Text != "")
{
if (s2 == 0 && s3 == 0 && s4 == 0)
{
cmstr = cmstr + " pname LIKE'%" + txtmname.Text + "%'";
s1 = 1;
}
else
{
cmstr = cmstr + " AND pname LIKE'%" + txtmname.Text + "%'";

}
}
if (txtmfamily.Text != "")
{
if (s1 == 0 && s3 == 0 && s4 == 0)
{
cmstr = cmstr + " pfamily LIKE'%" + txtmfamily.Text + "%'";
s2 = 1;
}
else
{
cmstr = cmstr + " AND pfamily LIKE'%" + txtmfamily.Text + "%'";

}
}
if (txtmdate.Text != "")
{
if (s1 == 0 && s2 == 0 && s4 == 0)
{
cmstr = cmstr + " pdate LIKE'%" + txtmdate.Text + "%'";
s3 = 1;
}
else
{
cmstr = cmstr + " AND pdate LIKE'%" + txtmdate.Text + "%'";

}
}
if (txtmparent.Text != "")
{
if (s1 == 0 && s2 == 0 && s3 == 0)
{
cmstr = cmstr + " pparent LIKE'%" + txtmparent.Text + "%'";
s4 = 1;
}
else
{
cmstr = cmstr + " AND pparent LIKE'%" + txtmparent.Text + "%'";

}
}

}

refresh();
}

اما به نظر من خیلی شلوغه و پشتوانه ی منطقی نداره


حالا توضیح :
این کد در ابتدا چک میکنه اگه همه تکست باکس ها پر بودند همه ی دیتابیس رو نشون بده
اگر نه
یک کلمه where به رشته ی cmstr که در اون کد sql قرار گرفته اضافه میشه
و ...
مقادیر s1 تا s4 هم برای این در نظر گرفته شدند که اگر یک تکه رشته به cmstr اضافه شد برای بار اول and نداشته باشه
امید وارم متوجه شده باشید !
در پایان هم تابع refresh صدا زده میشه که اینه
public void refresh()
{
try
{
OleDbDataAdapter da = new OleDbDataAdapter(cmstr,cn);
DataTable dt = new DataTable();
da.Fill(dt);
dgwm.DataSource = dt;
cmstr = "SELECT * FROM Member";
s1 = 0;
s2 = 0;
s3 = 0;
s4 = 0;
}
catch
{
MessageBox.Show("اشکال در دیتا بیس", "Error");
this.Close();

}
}

این کدها برای من خیلی خوب جواب میدن اما
دوستان و اساتید محترم میتونن یک روش بهتر و بهینه تر رو بگن یا ایراد های این کد ها رو ؟

sadeghx98
دوشنبه 25 شهریور 1392, 08:26 صبح
دوستان یعنی اینقدر این پیچیدست که کسی جواب نمیده ؟

sunboymn
دوشنبه 25 شهریور 1392, 10:36 صبح
منظورتون اینه که بر اساس چند فیلد میخواین جستجو رو انجام بدین؟ مثلا بر اساس نام یا نام خانوادگی

AliSaeedi_v
دوشنبه 25 شهریور 1392, 10:48 صبح
سلام دوست عزیز من منظورت رو ممکنه درست متوجه نشده باشم.ولی بهتره کلیه دستورات select رو به صورت کامل بنویسی و با شرط ها از هرکدوم هر کجا لازم بود استفاده کنی تا برنامه ات خوانا تر بشه..

sadeghx98
دوشنبه 25 شهریور 1392, 16:20 عصر
بله به محض اینکه هر تکست باکس (نام, نام خانوادگی ,تاریخ تولد, نام پدر) تغییر میکنه رشته ی جستوجو هم تغییر میکنه مثلا
از این حالت
SELECT * FROM Member
به این حالت
SELECT * FROM Member WHERE pname LIKE '%sadegh%' AND pfamily LIKE '%mohamadi%'

sadeghx98
دوشنبه 25 شهریور 1392, 16:23 عصر
سلام دوست عزیز من منظورت رو ممکنه درست متوجه نشده باشم.ولی بهتره کلیه دستورات select رو به صورت کامل بنویسی و با شرط ها از هرکدوم هر کجا لازم بود استفاده کنی تا برنامه ات خوانا تر بشه..

من میخوام به طور همزمان نتایج جستجو بر اساس همه ی تکست باکس های پر شده نشون داده بشه اون طور که شما میگید باید 24 شرط بنویسم

AliSaeedi_v
دوشنبه 25 شهریور 1392, 23:20 عصر
سلام میشه توضیح بدی چه تکس باکس هایی داری و میخوای که برچه اساسی جست و جو کنی..خیلی بد توضیح دادین.

cherchil_hra
سه شنبه 26 شهریور 1392, 08:09 صبح
با استفاده از 1=1 می تونی کوتاه تر بنویسی:


var cmd = new OleDbCommand();

var cmstr = "SELECT * FROM Member where 1=1 ";
if (txtmname.Text != "")
{
cmstr += " AND pname LIKE'%@Name%'";
cmd.Parameters.AddWithValue("@Name", txtmname.Text);
}

if (txtmfamily.Text != "")
{
cmstr += " AND pfamily LIKE'%@Family%'";
cmd.Parameters.AddWithValue("@Family", txtmfamily.Text);
}

if (txtmdate.Text != "")
{
cmstr += " AND pdate LIKE'%@Date%'";
cmd.Parameters.AddWithValue("@Date", txtmdate.Text);
}

if (txtmparent.Text != "")
{
cmstr += " AND pparent LIKE'%@Parent%'";
cmd.Parameters.AddWithValue("@Parent", txtmparent.Text);
}

cmd.CommandText = cmstr;
cmd.Connection.ConnectionString= Address;


حالا اگر کاربر فیلدی مقداردهی کنه در ادامه شرط where 1=1 اضافه میشه، اگر هم چیزی وارد نکنه شرط 1=1 همیشه برقرار و همه نفرات رو نشون میده و تاثیری در خروجی نداره.

همچنین از پارامترها استفاده کن که دچار SQL injection نشی.

موفق باشید!

sadeghx98
سه شنبه 26 شهریور 1392, 09:24 صبح
سلام میشه توضیح بدی چه تکس باکس هایی داری و میخوای که برچه اساسی جست و جو کنی..خیلی بد توضیح دادین.
سلام
من چهار تا فیلد دارم تو دیتابیس به نام های pname,pfamily,pdate,pparent و برای هر کدوم هم یک تکست باکس
برای مثال وقتی شما در تکست باکس نام حرف "s" و در تکست باکس فامیل حرف "m" رو وارد میکنید دستور sql این بشه
SELECT * FROM Member WHERE pname LIKE '%s%' AND pfamily LIKE '%M%'
و نتایج دیتا گرید ویو (dgwm) بر اساس این دستور آپ دیت شن

sadeghx98
سه شنبه 26 شهریور 1392, 09:29 صبح
با استفاده از 1=1 می تونی کوتاه تر بنویسی:


var cmd = new OleDbCommand();

var cmstr = "SELECT * FROM Member where 1=1 ";
if (txtmname.Text != "")
{
cmstr += " AND pname LIKE'%@Name%'";
cmd.Parameters.AddWithValue("@Name", txtmname.Text);
}

if (txtmfamily.Text != "")
{
cmstr += " AND pfamily LIKE'%@Family%'";
cmd.Parameters.AddWithValue("@Family", txtmfamily.Text);
}

if (txtmdate.Text != "")
{
cmstr += " AND pdate LIKE'%@Date%'";
cmd.Parameters.AddWithValue("@Date", txtmdate.Text);
}

if (txtmparent.Text != "")
{
cmstr += " AND pparent LIKE'%@Parent%'";
cmd.Parameters.AddWithValue("@Parent", txtmparent.Text);
}

cmd.CommandText = cmstr;
cmd.Connection.ConnectionString= Address;


حالا اگر کاربر فیلدی مقداردهی کنه در ادامه شرط where 1=1 اضافه میشه، اگر هم چیزی وارد نکنه شرط 1=1 همیشه برقرار و همه نفرات رو نشون میده و تاثیری در خروجی نداره.

همچنین از پارامترها استفاده کن که دچار SQL injection نشی.

موفق باشید!


دستتون درد نکنه من دنبال همین میگشتم
واقعا ممنونم

sunboymn
سه شنبه 26 شهریور 1392, 12:58 عصر
از entity استفاده کن خیلی کارو ساده کرده با این کد در داخل textchange
var q= context.tbl_test.where(p=> p.pname == txtname.text).contains();

sadeghx98
سه شنبه 26 شهریور 1392, 18:09 عصر
از entity استفاده کن خیلی کارو ساده کرده با این کد در داخل textchange
var q= context.tbl_test.where(p=> p.pname == txtname.text).contains();

عذر میخوام من مبتدیم میشه یکم بیشتر توضیح بدید این کد چیکار میکنه ؟