|
Ro'yxat 16.2. Ma'lumotlar to'plamini o'qish usuli
|
bet | 8/11 | Sana | 14.05.2024 | Hajmi | 379,31 Kb. | | #230939 |
Bog'liq Dasturlash 1 mustaqil ish variantRo'yxat 16.2. Ma'lumotlar to'plamini o'qish usuli
void ReadData()
{
// ulanishni ishga tushirish
OleDbConnection connection = CreateConnection();
// создать команду запроса
OleDbCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM Peoples";
// so'rovni bajarish
OleDbDataReader reader = command.ExecuteReader();
// ma'lumotlarni o'qish qismi
while (reader.Read())
{
ListViewItem item =
listView1.Items.Add(reader["Familiya"].ToString());
item.SubItems.Add(reader.GetValue(2).ToString());
item.SubItems.Add(reader.GetValue(3).ToString());
item.SubItems.Add(reader.GetValue(4).ToString());
}
connection.Close();
}
Misolni sinab ko'rish uchun men rasmda ko'rsatilgandek dastur yaratildi. 16.4.
Bunday holda, biz ma'lumotlar bazasi serverida biz allaqachon tanish bo'lgan tarzda buyruqlarni bajarish uchun ulanish va ob'ektni yaratamiz. Eng qizig'i, biz bu buyruqni qanday chaqiramiz va natijani qanday qayta ishlaymiz. Ma'lumotlar to'plamini olish uchun ExecuteReader() usuli yordamida SQL buyrug'ini bajarish kerakligini aytdim. Natijada OleDbDataReader ob'ektini qaytaradi, bu orqali biz natija ma'lumotlarini o'qiymiz.
Rasm. 16.4. Ish natijasi bilan ilova shakli
Natija ma'lumotlarining keyingi qatorini olish uchun siz OleDbDataReader sinfining Read() usulini chaqirishingiz kerak. Bu usul mantiqiy qiymatni qaytaradi, bu keyingi satr o'qilganligini aniqlaydi. Agar biz ma'lumotlar to'plamining oxiriga yetgan bo'lsak, u holda usul chaqiruvining natijasi noto'g'ri bo'ladi.
Read() usulidan foydalanib, biz to'plamning qatorlari bo'ylab harakat qilamiz. Ustun qiymatini qanday olasiz? Buning uchun kerakli ustun nomini ko'rsatgan holda ob'ekt indeksatoriga murojaat qilishingiz mumkin. Masalan, familiyali ustunni olish uchun siz o'quvchi ["Familiya"] ni yozasiz. Kvadrat qavs ichida satr sifatida bizga kerak bo'lgan ustun nomini ko'rsatamiz va uning qiymatini Ob'ekt sifatida olamiz. Bu usul yaxshi, ammo samarali emas. Gap shundaki, natijalar to‘plamida kerakli maydonni topish uchun har safar maydonni uning nomi bo‘yicha qidirish kerak bo‘ladi. Bu dastur uchun juda qimmat, ayniqsa kodingizdagi nomlar bo'yicha maydonlarga juda ko'p qo'ng'iroqlar bo'lsa.
Nom bo'yicha ma'lumotlarni olish o'rniga, ustun indeksiga murojaat qilishingiz mumkin. Bu usul tezroq ishlaydi va OleDbDataReader-da indeks bo'yicha ma'lumot olishning ko'plab usullari mavjud, ammo ular ham kamchiliklardan xoli emas, biz ularni biroz keyinroq ko'rib chiqamiz.
Keling, indeks bo'yicha ma'lumot olishning qanday usullari mavjudligini ko'rib chiqaylik. Ustun qiymatlarini GetValue() usuli yordamida ham olish mumkin. Ushbu usul sizni qiziqtirgan ustun indeksini o'tkazishi kerak. Bu usul avvalgi misolda ham qo'llaniladi. Indeksator orqali faqat familiyani olaman. Boshqa barcha ustun qiymatlari GetValue() usuli orqali olaman.
Agar o'zingizning massivlaringiz bilan ishlash sizga qulayroq bo'lsa yoki bunday ehtiyoj bo'lsa, GetValues () usulidan foydalanishingiz mumkin. Ushbu usul natija qiymatlarining mazmunini ob'ektlar qatoriga ko'chiradi. Usulni parametr sifatida ishga tushirilgan massivdan o'tkazish kerak. Massiv qiymatlari soni olingan maydonlar bilan bir xil bo'lishi kerak. Bu mumkin va kamroq, bu xatolikka olib kelmaydi. U massivda qancha qiymatlar bo'lsa, shuncha maydonni to'ldiradi. Natijadagi maydonlar sonini FieldCount xususiyati orqali topish mumkin. Quyidagi misol ushbu usuldan qanday foydalanishni ko'rsatadi:
Object[] row = new Object[reader.FieldCount];
reader.GetValues(row);
Kodning birinchi qatori natijalarni saqlash uchun ob'ektlar qatorini ishga tushiradi va ikkinchi qatorda GetValues () usuli qo'llaniladi. Natijada, usul ko'chirilgan maydonlar sonini qaytaradi.
Ammo umumiy ob'ekt sifatida ma'lumotlar bilan ishlash har doim ham qulay emas. Masalan, bizning holatimizda uchinchi maydon sana hisoblanadi va shunchaki sana obyektini ToString() usuli yordamida satrga aylantirish har doim ham yaxshi yechim emas. Va agar siz ushbu sana bilan xuddi sana bilan ishlashingiz kerak bo'lsa? Muammo juda oddiy hal qilinadi - ma'lum bir ma'lumot turidagi ma'lumotlarni qaytaradigan maxsus usullardan foydalanishingiz kerak. Masalan, sana sifatida qiymat olish uchun GetDateTime() usulidan foydalanishingiz mumkin:
reader.GetDateTime(3)
Keling, qiymatlarni olishning yana qanday usullari mavjudligini ko'rib chiqaylik. Barcha usullar parametr sifatida qaytariladigan maydon indeksini oladi:
GetBoolean() — maydon qiymatini mantiqiy qiymat sifatida qaytaradi;
GetByte() — maydon qiymatini bayt sifatida qaytaradi;
GetChar() — maydon qiymatini belgi sifatida qaytaradi;
GetDecimal() — maydon qiymatini O'nlik son sifatida qaytaradi;
GetDouble() — maydon qiymatini suzuvchi nuqta raqami sifatida qaytaradi;
GetString() — maydon qiymatini satr sifatida qaytaradi.
Bu barcha usullar emas. Deyarli har bir ma'lumot turi uchun ularning ko'pi bor va ularning barchasi GetDataType() ko'rinishiga ega.
Maydonga indeks bo'yicha murojaat qilishning asosiy kamchiligi moslashuvchanlikni yo'qotishdir. Agar siz so'rovdagi maydonlar ketma-ketligini o'zgartirishga yoki so'rovdan maydonni olib tashlashga qaror qilsangiz, kodni tuzatishingiz kerak bo'ladi. Jadvalning tuzilishini o'zgartirishda ham muammolar paydo bo'lishi mumkin. Masalan, 16.2 ro'yxatdagi kod yulduzcha (SELECT *) yordamida jadvaldagi barcha maydonlarni tanlaydi. Jadvalning tuzilishini o'zgartirsangiz, so'rov ma'lumotlarni noto'g'ri tartibda qaytarishi mumkin va indeks chaqiruvi dasturni buzadi. Ma'lumotlarning to'g'riligi xavf ostida bo'ladi.
Ma'lumotlar strukturasini o'zgartirish yoki jadvaldagi so'rovlarni o'zgartirish jiddiy muammolarga olib kelishi mumkin. Ma'lum bo'lishicha, biz qiymatlarga - maydon nomlari yoki indekslariga kirish uchun nimadan foydalanishni tanlashga duch keldik. Birinchi holda, biz ishlashda yutqazamiz, lekin biz moslashuvchanlikni qo'lga kiritamiz va ikkinchi holatda, aksincha.
Darhaqiqat, men sizga hali ham maydonlarga nom bilan murojaat qilishingizni tavsiya qilaman. Tezlikdagi yo'qotish unchalik katta emas, shuning uchun bu muammoni e'tiborsiz qoldirish mumkin. Siz o'rta joyni topishga harakat qilishingiz yoki optimallashtirish usullaridan foydalanishingiz mumkin. Misol uchun, agar bitta maydonga bir nechta qo'ng'iroqlar bo'lsa, siz eng boshida maydon indeksini uning nomi bilan aniqlashingiz va keyin indeksga murojaat qilishingiz mumkin. Ustun indeksini nomi bo'yicha aniqlash uchun siz parametr sifatida satrni qabul qiladigan va raqamli indeksni qaytaradigan GetOrdinal() usulidan foydalanishingiz mumkin. Masalan:
int nameIndex = reader.GetOrdinal("Ism");
reader.GetValue(nameIndex);
Birinchi qatorda biz indeksni aniqlaymiz, so'ngra olingan indeks bo'yicha qiymatga xohlaganimizcha kirishimiz mumkin. Bunday kod eng ko'p qirrali va ishlashda ko'p narsani yo'qotmaydi. Maydon indeksini aniqlash looplarda yaxshi ishlaydi. Masalan:
OleDbDataReader reader = command.ExecuteReader();
int lastnameIndex = reader.GetOrdinal("Ism");
// Bu yerda boshqa sohalar indekslarini aniqlash mumkin
while (reader.Read())
{
ListViewItem item =
listView1.Items.Add(reader.GetValue(lastnameIndex).ToString());
// bu yerda boshqa maydonlardan foydalanayotgan bo'lishi mumkin
}
|
| |