آموزش جستجو در دیتابیس در سی شارپ
در جلسه قبل با آموزش حذف در سی شارپ و همچنین افزودن آشنا شدید در این جلسه، هم قصد دارم تا دستور Select در سی شارپ را معرفی کنم.
با استفاده از دستور Select در جلسه قبلی توانستید اطلاعات دیتابیس را در گرید ویو نمایش دهید در این جلسه هم قصد داریم با همان دستور Select عملیات جستجو را انجام دهیم و سپس نتیجه را در همان گریدویو نمایش دهیم. پس بنابراین پروژه قبلی را باز کرده و یک TextBox به پروژه اضافه کنید یا یک پروژه جدید ایجاد کنید و کنترل های لازم را به پروژه اضافه کنید.
دیتابیس پروژه
دیتابیس این پروژه بشکل زیر می باشد.
- نام دیتابیس: db_user
- نام جدول User
- کلیداصلی UserId
- جستجو با نام کاربری
در این پروژه می خواهیم عملیات جستجو را با نام کاربری انجام دهیم. شما می توانید به جای آن هر فیلدی را در نظیر بگیرید، هچنین می توانید دو فیلد را همزمان در نظر بگیرید.
ارتباط با دیتابیس
قبل از اینکه وارد پروژه جستجو در سی شارپ شویم، در ابتدای کار می خواهیم با دیتابیس ارتباط برقرار کنیم برای چنین منظوری مراحل زیر را دنبال کنید:
1.کلیدهای ترکیبی Ctrl+Alt+S را فشار دهید تا پنجره Server Explorer واقع در منوی View باز شود. بشکل زیر
2.روی آیکون Connect To database کلیک کنید پنجره زیر ظاهر خواهد شد در این پنجره در بخش Server Name نام سرور را وارد کنید چون سرورما محلی است در آن قسمت localhost را وارد کنید و در بخش Select or enter a database name دیتابیس مورد نظر را انتخاب کنید ولی و روی TestConnection کلیک کنید.
وارد بخش Advanced در این پنجره شوید و قسمت مشخص شده با رنگ آبی را در تصویر زیر کپی کنید و آن نگه دارید تا برسیم به آن و استفاده کنیم.
برنامه نویسی پروژه
به پروژه برگشته و روی Textbox دابل کلیک کنید تا وارد رویداد TextChange آن شویم دستورات زیر را در آن قرار دهید.
در این پروژه به فضای نام زیر نیاز داریم آن در بالا قرار دهید
using System.Data.SqlClient;
حال در رویداد TextChange تکست باکس دستورات زیر را می توانید قرار دهید. قسمت های مبهم را توضیح خواهم داد.
string addConn = "Data Source=localhost;Initial Catalog=db_user;Integrated Security=True";
SqlConnection conn = new SqlConnection(addConn);
در متغیر addConn مقداری که گفته بودم موقع ارتباط با دیتابیس کپی کنید قرارداده شده است. این در واقع آدرسی ایست که دیتابیس در آن سرور قراردارد می باشد.
حال کوئری مورد نظر برای جستجو بصورت زیر می باشد:
string query = "SELECT * FROM [User] WHERE UserName LIKE '%' +@parametr+ '%'";
@parametr اشاره دارد به مقداری که قرار است در دیتابیس جستجو شود و این مقدار را از TextBox خواهیم گرفت.
در این دستور هم گفتیم که query ما را بردار و در آدرسی که دادم قرار بده.
SqlCommand cmd = new SqlCommand(query, conn);
در دستور زیر گفتیم پارامتر ما از txtSearch گرفته خواهد شد.
cmd.Parameters.AddWithValue("@parametr", txtSearch.Text);
ما برای اینکه بتوانیم اطلاعات دیتابیس را به گریدویو انتقال دهیم، باید اطلاعات دیتابیس را در DataTable قرار دهیم و سپس از DataTable به گرید ویو منتقل کنیم. و کلاس SqlCommand قادر نیست تا این کار را برای ما انجام دهد کلاسی که می توانید این کار را انجام دهد SqlDataAdapder می باشد بنابراین cmd را در SqlDataAdapter قرار می دهیم.
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
با این دستور گفتیم آقای sda لطفاً دیتاتیبل ما را پر کن.
sda.Fill(dt);
در دستور زیر گفتیم که کانکشن ما را باز کن و کوئری ما را در نهایت اجرا کن، سپس کانکشن را ببند.
conn.Open();
cmd.ExecuteScalar();
conn.Close();
حال اطلاعات دیتابیس در DataTable قرار دارد و ما کافی است تا dt را در DataSource گرید ویو قرار دهیم.
dataGridView1.DataSource = dt;
کل سورس کد:
string addConn = "Data Source=localhost;Initial Catalog=db_user;Integrated Security=True";
SqlConnection conn = new SqlConnection(addConn);
string query = "SELECT * FROM [User] WHERE UserName LIKE '%' +@parametr+ '%'";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@parametr", txtSearch.Text);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);
conn.Open();
cmd.ExecuteScalar();
conn.Close();
dataGridView1.DataSource = dt;
اگر با مشکلی روبرو شدید لطفاً سوال خود را مطرح کنید.
دانلود پروژه به همراه دیتابیس
دانلود با لینک مستقیم
Comments (17)
سلام وقت بخیر
اگر جستجو بر اساس چند فیلد باشه( چند تکس باکس) به چه صورت هست؟
سلام
اونموقع بهتر است کلاً یدونه باشه و از دستور like استفاده کنید و تمامی فیلدها رو در دستور like مورد بررسی قرار بدید تا جستجو بر اساس تمام فیلدهای مد نظرتون انجام بشه.
میشه این مورد اخرا بیشتر توضیح بدید
سلام
منظورم اینه که اگه بخوایین قصد جستجو با تمامی فیلدها رو داشته باشید اونموقع هیچ فرقی تو تعداد تکست باکس ها ایجاد نخواهد شد
تنها موردی که تغییر خواهد کوئری به دیتابیس است که تک فیلدهای مد نظر رو در شرط where مورد بررسی قرار میدیم منتهی با کلمه کلیدی LIKE اگر نحوه نوشتن کوئری رو بلد نیستید اطلاع بدید براتون بفرستم.
باتشکر از توجه شما.
سلام وقت بخیر من یه برنامه دارم که جستجو بر اساس نام دانشجو انجام میشه اگه textbox خالی بود و دکمه جستجو زده شد اطلاعات را نمایش دهد وگرنه عملیات جستجو انجام بشه …. این کد که تو سایت بود انجام دادم ولی از sad.fill)dt(;ارور میگیره
سلام بفرمایید ارورتون چیه
سلام و وقتتون بخیر.من یک فرم دارم که برای جستجو بر اساس کد ملی و صلاحیت و رشته میخوام ازش استفاده کنم.چجوری میتونم این کار رو انجام بدم ؟میخوام که بر اساس هر کدوم که انجام شد نتیجه رو توی datagridview نمایش بده.ممنون میشم راهنمایی کنین
سلام
پاسخ شما رو در یک pdf آماده کردم میتونید از اینجا دانلود کنید
اگر متوجه نشدید بگید بیشتر توضیح بدم
ممنون از لطفتون.فقط یه سری ایرادها هست که اگه لطف کنین جواب بدین ممنون میشم.
اول اینکه توی قسمت select نوشتین @parametr جای اون چی باید قرار بگیره ؟
توی قسمت if و elseif تمام خطوط رو ایراد گرفته البته بجز filedName.حتی از else if هم ایراد گرفته
توی قسمت آخر که نوشتین عمل سرچ چی باید نوشته بشه؟
وافعا ممنون از راهنماییتون
توی قسمت if و else if بعد از مساوی fileName چی باید نوشته بشه؟
هرچی مینوستم ایراد میگیره
سلام
کلاً سورسش رو میتونید از اینجا دانلود کنید
توضیحات داخل سورسها هستش. فقط کافیه کانکشن استرینگ رو تنظیم کنید و نام فیلدها رو هم حتماً تنظیم کنید. منظورم متغیر filedName هستش که داریم داخل شرط ها set می کنیم.
خیلی ممنونم از لطف و راهنماییتون.فقط یه ایراد داره ظاهرا
از کد sda,fill(dt) ایراد میگیره و ارور Incorrect syntax near “=” رو نشون میده
کانکشن استرینگ و نام فیلد ها رو هم تنظیم کردم
سلام لطفاً از چت آنلاین در پایین سمت راست استفاده کنید و از ارور موجود اسکرین بفرستید. ضمناً در کوئری که درست کردیم، اونجا بعد از WHERE و قبل از =@parametr یه فاصله ایجاد کنید. نام جدول هم داخل [] قرار داده بشه به اینصورت:
String query = “SELECT * FROM [tbl_chech] WHERE ” + filedName + ” =@parametr”;
و اینکه این متغیر رو بیارینش پایین از تر sqlconnection قرار دهید.
سلام ببخشد اگر بخوایم یه رکورد فارسی و متن فارسی رو فیلتر کنیم تو دیتابیس باید چیکار کنیم چون این کد جواب نمیداد
سلام اگه جواب نداد میتونید از روش linq to SQL استفاده کنید اما معمولا جواب میده من فارسی هم جستجو کردم کار میکنه.
لینک دانلود خراب است .
لینک اصلاح شد – با تشکر