|
Berilganlar bazasi ado. Net ulanish satri Ma’lumotlar bazasiga ulanish
|
bet | 11/11 | Sana | 15.05.2024 | Hajmi | 379,38 Kb. | | #234223 |
Bog'liq Berilganlar bazasi ado. Net ulanish satri Ma’lumotlar bazasiga u16.18. Tegishli ma'lumotlar
Aytaylik, bizda ikkita stol bor. Jadvallardan birida barcha odamlarni tanlash natijasi, ikkinchisida esa barcha manzillar tanlovi natijasi mavjud. Qanday qilib odam haqida yozuvga ega bo'lib, uning barcha manzillarini qo'shni jadvaldan olish mumkin? Quyidagi ma'lumotlar bazasi so'rovini ishga tushirish orqali biz bu muammoni allaqachon hal qildik:
SELECT *
FROM Peoples p, Address a
WHERE idKey = idPeopleKey
Bunga javoban server kerakli yozuvlarni alohida natijalar jadvalida bizga qaytaradi. Ammo bizda ikkita jadvalda natija bor, nima uchun bizga tegishli ma'lumotlarni o'z ichiga olgan uchinchi natija kerak? Bizda mavjud bo'lgan narsadan foydalanib, ikkita so'rov natijalarini birlashtira olmaymizmi? Iloji boricha, mumkin! Buning uchun faqat jadval munosabatlarini ko'rsatish kerak.
Yangi dastur yarating va formaga ikkita DataGridView-ni joylashtiring. Konstruktorda InitializeComponent() ga qo'ng'iroq qilgandan so'ng, ReadData() usuliga qo'ng'iroq yozing, uning kodini 16.10 Listingda ko'rish mumkin.
Ro'yxat 16.10. Ma'lumotlarni o'qish usuli
void ReadData()
{
OleDbConnection connection = CreateConnection();
// buyruq ob'ektini yaratish
OleDbCommand command = new OleDbCommand(
"SELECT * FROM Peoples; SELECT * FROM Address;");
command.Connection = connection;
// adapter yarating va natijani ma'lumotlar to'plamiga nusxalash
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
dataset = new DataSet();
adapter.Fill(dataset);
connection.Close();
// munosabat yaratish
DataRelation relation = new DataRelation("People_Address",
dataset.Tables[0].Columns[0],
dataset.Tables[1].Columns[1]);
dataset.Relations.Add(relation);
// jadvallarni tarmoqqa ulash
peopleDataGridView.DataSource = dataset.Tables[0];
addressDataGridView.DataSource = dataset.Tables[1];
}
16.20. Ma'lumotlarni filtrlash
Ma'lumotlar namunasini olganimizdan so'ng, biz ma'lum bir vaqtning o'zida ko'rsatiladigan ma'lumotlar miqdorini yanada toraytirish uchun ma'lumotlarga qo'shimcha filtrlarni qo'llashimiz mumkin. Masalan, foydalanuvchi barcha foydalanuvchilarni "Xalqlar" jadvalidan so'rashi va keyin ushbu to'plamda familiyasi ma'lum bir harf bilan boshlangan barcha odamlarni topishi mumkin.
Shunday qilib, deylik, bizning ilovamiz boshida ma'lumotlar to'plamini yaratadi, unga shunchaki barcha odamlar tanlovi natijasini yuklaydi. Shaklda biz foydalanuvchi familiyasining bir qismini kiritishi mumkin bo'lgan kiritish maydonini joylashtiramiz, bu orqali filtrlash amalga oshiriladi. Shuningdek, bizga tugma kerak, uni bosish orqali biz to'g'ridan-to'g'ri filtrlaymiz. Tugma uchun Click hodisasida quyidagi kodni yozing:
private void findButton_Click(object sender, EventArgs e)
{
string filter = "Familiya LIKE '" + nameTextBox.Text + "%'";
DataRow[] rows = dataset.Tables[0].Select(filter);
string found = "";
foreach (DataRow row in rows)
found += row.ItemArray[1].ToString() + "\n";
MessageBox.Show(found);
}
Kodning o'qilishi uchun kodning birinchi qatorida men filtrlash shartini o'z ichiga olgan filtr qatorini hosil qilaman. Buni qo'shimcha o'zgaruvchisiz qilish mumkin edi, lekin menga bu aniqroq tuyuldi. Filtrga nima mos keladi? Unda biz SQL so'rovlarida bo'lgani kabi LIKE operatoriga ega bo'lamiz. Agar foydalanuvchi formadagi nameTextBox kiritish maydoniga “I” harfini kiritsa, filtr shunday ko‘rinishga ega bo‘ladi:
Familiya LIKE 'I%'
Ushbu filtrni jadvalning Select() usuliga o'tkazamiz (bizning holatda bizda faqat bitta) va natijada ko'rsatilgan filtrni qanoatlantiradigan qatorlar to'plamini olamiz. Misolni tushunarli qilish uchun hosil bo'lgan qatorlar bo'ylab takrorlanadigan va topilgan familiyalarni dialog oynasida ko'rsatadigan sikl yaratiladi.
Agar ustun nomi bo'sh joylarni o'z ichiga olsa, so'rovlarda bo'lgani kabi, filtrlarda ham bunday nom kvadrat qavs ichiga olinishi kerak. Masalan:
[Tug'ilgan sana] = # 12.21.1974 #
Ushbu misolda sana qanday yozilganiga e'tibor bering. U # xesh belgilariga kiritilgan va MM / DD / YYYY formatiga ega.
Select() usuli ikkita string parametrini oladigan bitta qiziqarli ortiqcha yukga ega. Usul ikkinchi parametr sifatida tartiblash qatorini oladi va uni SQL so'rovidagi kabi ko'rsatish mumkin, faqat ORDER BY kalit so'zlarini tashlab qo'yish orqali. Bu ASC va DESC yordamida tartiblash tartibini belgilashingiz mumkinligini anglatadi. Masalan, quyidagi filtrlash kodi familiyasi "I" harfi bilan boshlangan barcha odamlarni ism bo'yicha tartiblangan holda qaytaradi:
String filter = "[Familiya] LIKE 'I%'";
DataRow[] rows = dataset.Tables[0].Select(filter, "Имя DESC");
Ushbu filtrning natijasi xuddi SQL so'roviga bir xil shartni qo'shishingiz bilan bir xil bo'ladi, lekin yagona farq bu shart bajariladigan joyda. Agar so'rovga shart qo'shilsa, filtrlash ma'lumotlar bazasi serverida sodir bo'ladi va serverdan mijozga faqat kerakli yozuvlar uzatiladi. Ushbu yondashuvning afzalligi shundaki, serverdan mijozga faqat kerakli ma'lumotlar uzatiladi. Server ma'lumotlarni uzatish uchun kamroq resurslar sarflaydi va tarmoq keraksiz ma'lumotlar bilan yuklanmaydi.
ADO.NET filtrlashdan foydalanganda server barcha jadval ma'lumotlarini bizga qaytaradi va biz uni mijoz tomonida filtrlaymiz. Agar so'ralgan jadvalda 1000 ta satr bo'lsa va sizga faqat 10 ta kerak bo'lsa, butun to'plamni so'rash serverni bizga barcha 1000 qatorni yuborishga majbur qiladi, bu samarasiz. Bunday holda, mijoz kompyuteri serverga tayinlanishi mumkin bo'lgan filtrlash uchun qo'shimcha resurslarni ham sarflaydi.
Ma'lumotlarni filtrlashdan keraksiz foydalanmaslikka harakat qiling. Buning o'rniga, faqat foydalanuvchiga kerak bo'lgan ma'lumotlarni qaytarish uchun SQL so'rovlaridan foydalaning. Shunday qilib, siz server va mijozning trafik va resurslarini tejaysiz. Ko'pincha server uchun 100 000 ta yozuvni filtrlash va ulardan 10 tasini qaytarish mijozga barcha 100 000 yozuvlarni o'zi filtrlashi uchun yuborishdan ko'ra osonroqdir.
Filtrlash mijoz tomonidan keraksiz ma'lumotlarsiz kerakli va etarli ma'lumotlar to'plamini olgan va negadir biror narsani aniqlashtirishga qaror qilganda foydalanishi mumkin.
|
| |