PDA

View Full Version : سوال: جستجو بر اساس بعضی فیلدها جواب نمیده



csharpdoost
چهارشنبه 04 اسفند 1400, 06:12 صبح
با سلام.
دیتابیس اکسس هستش. وقتی میخوام جستجو کنم اگر همه فیلدها رو پر کنم و جستجو رو انجام بدم جواب میده اما اگر یکی یا دو تا فیلد رو پرکنم و جستجو بزنم جواب نمیده و خالی میاره.


con = new OleDbConnection(); cmd = new OleDbCommand(); dt = new DataTable(); sda = new OleDbDataAdapter();

conOpen();

cmd.Parameters.AddWithValue("@cname", "%" + name + "%");
cmd.Parameters.AddWithValue("@cfamily", "%" + family + "%");
cmd.Parameters.AddWithValue("@telphon", "%" + telphone + "%");
cmd.Parameters.AddWithValue("@telphon1", "%" + telphone1 + "%");
cmd.CommandText = "SELECT * FROM customer WHERE 1=1 and (cname LIKE @cname and cfamily LIKE @cfamily and telphon LIKE @telphon and telphon1 LIKE @telphon1 )";

dr = cmd.ExecuteReader();
dt.Load(dr);
con.Close();
dr.Dispose(); cmd.Dispose(); con.Dispose();

return dt;

mr.sirwan
چهارشنبه 04 اسفند 1400, 09:14 صبح
سلام، برای اینکار باید به جای And از عملگر OR استفاده کنید

mazoolagh
چهارشنبه 04 اسفند 1400, 09:56 صبح
اون AND که باید همون باشه چون منطق جستجو بر همین اساس هست.
ظاهر کد هم درسته، فقط باید مقادیری که بعنوان پارامتر مشخص میشه اگر خالی هست باید مطمئن بشین string.empty هست یا "" ؛
شاید space باشه.

mehran6764
چهارشنبه 04 اسفند 1400, 11:18 صبح
اون AND که باید همون باشه چون منطق جستجو بر همین اساس هست.
ظاهر کد هم درسته، فقط باید مقادیری که بعنوان پارامتر مشخص میشه اگر خالی هست باید مطمئن بشین string.empty هست یا "" ؛
شاید space باشه.

به نظرم کدشون درست نیست ، برداشتم اینکه ایشون میخوان اگر فرضا اگر اسم وارد بشه تو نتیجه کوئری اون اسم ها هم نمایش داده بشه ، اما
حالتی که شما می فرمایید یعنی اینکه مثلا اگر اسم وارد نشد یعنی دنبال اسم هایی بگرده که رشته خالی داره ؟ (( درست متوجه شدم ؟!))

csharpdoost
چهارشنبه 04 اسفند 1400, 19:10 عصر
ممنون از دوستان. از or که استفاده میکنم همه افراد رو میاره.
اما از این کد که استفاده کردم درست شد.

string query = "SELECT * from customer WHERE 1=1 ";
if (name != string.Empty)
query += "AND cname=@cname";

if (family != string.Empty)
query += " AND cfamily=@cfamily";

if (telphone != string.Empty)
query += " AND telphon=@telphon";

if (telphone1 != string.Empty)
query += " AND telphone1=@telphone1";

cmd.Parameters.AddWithValue("@cname", name);
cmd.Parameters.AddWithValue("@cfamily", family);
cmd.Parameters.AddWithValue("@telphon", telphone);
cmd.Parameters.AddWithValue("@telphon1", telphone1);
اما مورد باید دقیقا تایپ بشه. توی این کد از like چطوری میشه استفاده کرد تا موراد مشابه رو هم پیدا کنه؟
ممنون

mazoolagh
پنج شنبه 05 اسفند 1400, 09:54 صبح
به نظرم کدشون درست نیست

سلام و روز خوش
این کد شاید خیلی تمیز و بهینه نباشه، ولی مشکلی از لحاظ اجرا و درست آوردن نتایج نداره.
من بعد از پست شما برای اطمینان کد رو تست هم کردم - مشکلی نداشت.


، برداشتم اینکه ایشون میخوان اگر فرضا اگر اسم وارد بشه تو نتیجه کوئری اون اسم ها هم نمایش داده بشه ، اما
حالتی که شما می فرمایید یعنی اینکه مثلا اگر اسم وارد نشد یعنی دنبال اسم هایی بگرده که رشته خالی داره ؟ (( درست متوجه شدم ؟!))
اونچه که ظاهر امر نشون میده اینه که هر کدوم از پارامترها مقدار داشت موثر باشه و پارامترهایی که مقدار ندارن در نتیجه بی تاثیر باشن؛ بعبارتی اگه همه "" باشن کل رکوردها رو بیاره.

mazoolagh
پنج شنبه 05 اسفند 1400, 09:55 صبح
ممنون از دوستان. از or که استفاده میکنم همه افراد رو میاره.
اما از این کد که استفاده کردم درست شد.
....
ما مورد باید دقیقا تایپ بشه. توی این کد از like چطوری میشه استفاده کرد تا موراد مشابه رو هم پیدا کنه؟
ممنون

من با همون کد اولیه شما هم جواب گرفتم!

mazoolagh
پنج شنبه 05 اسفند 1400, 09:59 صبح
Const constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=NortWind.accdb;Persist Security Info=False;"

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.DataSource = GetResults(String.Empty, String.Empty, String.Empty)
End Sub


Private Sub DoFilter_Click(sender As Object, e As EventArgs) Handles DoFilter.Click
DataGridView1.DataSource = GetResults(Company_Name.Text, Contact_Name.Text, Contact_Title.Text)
End Sub

Private Function GetResults(P1 As String, P2 As String, P3 As String) As DataTable
Dim dt As New DataTable
Using con As New OleDb.OleDbConnection(constr)
con.Open()
Using cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.Parameters.AddWithValue("@P1", "%" + P1 + "%")
cmd.Parameters.AddWithValue("@P2", "%" + P2 + "%")
cmd.Parameters.AddWithValue("@P3", "%" + P3 + "%")
cmd.CommandText = "SELECT * FROM CUSTOMERS WHERE (CompanyName LIKE @P1) AND (ContactName LIKE @P2) AND (ContactTitle LIKE @P3)"
Dim DR As OleDb.OleDbDataReader = cmd.ExecuteReader
dt.Load(DR)
End Using
con.Close()
End Using
Return dt
End Function

mazoolagh
پنج شنبه 05 اسفند 1400, 10:06 صبح
153715

153716

153717

153718

csharpdoost
پنج شنبه 05 اسفند 1400, 20:29 عصر
Const constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=NortWind.accdb;Persist Security Info=False;"

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.DataSource = GetResults(String.Empty, String.Empty, String.Empty)
End Sub


Private Sub DoFilter_Click(sender As Object, e As EventArgs) Handles DoFilter.Click
DataGridView1.DataSource = GetResults(Company_Name.Text, Contact_Name.Text, Contact_Title.Text)
End Sub

Private Function GetResults(P1 As String, P2 As String, P3 As String) As DataTable
Dim dt As New DataTable
Using con As New OleDb.OleDbConnection(constr)
con.Open()
Using cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.Parameters.AddWithValue("@P1", "%" + P1 + "%")
cmd.Parameters.AddWithValue("@P2", "%" + P2 + "%")
cmd.Parameters.AddWithValue("@P3", "%" + P3 + "%")
cmd.CommandText = "SELECT * FROM CUSTOMERS WHERE (CompanyName LIKE @P1) AND (ContactName LIKE @P2) AND (ContactTitle LIKE @P3)"
Dim DR As OleDb.OleDbDataReader = cmd.ExecuteReader
dt.Load(DR)
End Using
con.Close()
End Using
Return dt
End Function


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

cmd.CommandText = "SELECT * FROM customer WHERE (1=1) AND (cname LIKE @cname AND cfamily LIKE @cfamily AND telphon LIKE @telphon )";


(1=1) مینوشتم

mazoolagh
یک شنبه 08 اسفند 1400, 08:21 صبح
بله درسته . اشکال کد من یه پرانتز بود!
باید

cmd.CommandText = "SELECT * FROM customer WHERE (1=1) AND (cname LIKE @cname AND cfamily LIKE @cfamily AND telphon LIKE @telphon )";


(1=1) مینوشتم

اون عبارت (1=1) کلا نیاز نیست!

Mahmoud.Afrad
پنج شنبه 12 اسفند 1400, 16:07 عصر
اون عبارت (1=1) کلا نیاز نیست!
حالتی که همه فیلدها خالی هست رو در نظر بگیرید.

mazoolagh
شنبه 14 اسفند 1400, 10:30 صبح
حالتی که همه فیلدها خالی هست رو در نظر بگیرید.

سلام و روز خوش
حتی در اون حالت هم نیاز نیست، به کد form_load و تصویر پیوست آخر دقت کنین مشخص هست.

این که یک عبارت خنثی در شرط گذاشته بشه برای زمانی هست که commandtext رو تکه تکه سر هم میکنیم (که کار بدی هست)،
ولی اینجا از پارامتر استفاده میکنیم.

mazoolagh
شنبه 14 اسفند 1400, 10:37 صبح
البته این کد که گذاشتم سعی کردم تا حد امکان شبیه به کد استارتر محترم تاپیک باشه تا اشکال کار مشخص بشه،
وگرنه کار خوبی نیست که هر بار برای فیلتر کردن نتایج دیتا رو دوباره از دیتابیس بخونیم مگر این که دلیل موجهی داشته باشیم.

بهتر هست که فقط یکبار در form load جدول رو پر کنیم و هر بار که نیاز به فیلتر داشتیم فقط نتایج همون جدول رو فیلتر کنیم.

mazoolagh
شنبه 14 اسفند 1400, 10:38 صبح
Const constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=NorthWind.accdb;Persist Security Info=False;"
Const whr = "(CompanyName LIKE '%@P1%') AND (ContactName LIKE '%@P2%') AND (ContactTitle LIKE '%@P3%')"
Private dt As New DataTable

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Using con As New OleDb.OleDbConnection(constr)
con.Open()
Using cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "SELECT * FROM CUSTOMERS"
Dim DR As OleDb.OleDbDataReader = cmd.ExecuteReader
dt.Load(DR)
End Using
con.Close()
End Using
DataGridView1.DataSource = dt
End Sub


Private Sub DoFilter_Click(sender As Object, e As EventArgs) Handles DoFilter.Click
dt.DefaultView.RowFilter = FilterString(Company_Name.Text, Contact_Name.Text, Contact_Title.Text)
End Sub

Private Function FilterString(P1 As String, P2 As String, P3 As String) As String
Return whr.Replace("@P1", P1).Replace("@P2", P2).Replace("@P3", P3)
End Function

Mahmoud.Afrad
چهارشنبه 18 اسفند 1400, 03:32 صبح
سلام و روز خوش
حتی در اون حالت هم نیاز نیست، به کد form_load و تصویر پیوست آخر دقت کنین مشخص هست.

این که یک عبارت خنثی در شرط گذاشته بشه برای زمانی هست که commandtext رو تکه تکه سر هم میکنیم (که کار بدی هست)،
ولی اینجا از پارامتر استفاده میکنیم.
آره حواسم نبود کدوم کد رو میگید. کد پست اول نیازی نداره ولی کد پست ۵ نیاز داره.