I-BOB Nazariy qism     Ma’lumotlar bazasi

I-BOB Nazariy qism Ma’lumotlar bazasi.
Listing 1.0. Ma'lumotlar bazasini o‘qish usuli
|
Void ReadData()
{
// ulanishni boshlash
OleDbConnection connection = CreateConnection();
// so‘rov buyrug‘ini yarating
OleDbCommand command = connection.CreateCommand();
Command.CommandText = “SELECT * FROM Peoples”;
// so‘rovni bajaring
OleDbDataReader reader = command.ExecuteReader();
// ma'lumotlarni o‘qish tsikli
while( reader.Read() )
{
ListViewItem item = listView1.Items.Add(reader[“Familya”].ToString());
item.SubItems.Add(reader.GetValue(2).ToString());
item.SubItems.Add(reader.GetValue(3).ToString());
item.SubItems.Add(reader.GetValue(4).ToString());
}
Connection.Close();
}
Misol uchun, men rasmda ko‘rsatilgandek dasturni yaratdim. Listing 1.1. Qulaylik uchun, men natijani ko‘rsatganda dasturni bajarish vaqtida asosiy shaklni suratga oldim.
Bunday holda, biz ma'lumotlar bazasi serverida buyruqlarni bajarish uchun ulanish va ob'ektni yaratish uchun bizga tanishmiz. Qizig‘i shundaki, biz ushbu jamoani qanday chaqiramiz va natijani qanday hal qilamiz. Men ma'lumotlar to‘plamini olish uchun ExecuteReader ( ) usuli yordamida №-buyruqni bajarish kerakligini aytdim . Natija sifatida OleDbDataReader ob'ektini qaytaradi, bu orqali biz natija ma'lumotlarini o‘qiymiz.
Listing 1.1 Rasm Ish natijasi bilan ariza shakli
Natija ma'lumotlar keyingi chiziq olish uchun, Agar usuli qo‘ng‘iroq qilish kerak Read( ) sinf OleDbDataReader. Bu usul Bulevo qiymatini qaytaradi, qaysi belgilaydi, keyingi chiziq o‘qish yoki yo‘qligini. Agar ma'lumotlar to‘plamining oxiriga yetgan bo‘lsak, unda usulning chaqiruvi noto‘g‘ri bo‘ladi.
Read () usulidan foydalanib, biz to‘plamning satrlari bo‘ylab harakatlanamiz. Va ustun qiymatini qanday olish mumkin? Buning uchun siz kerakli ustun nomini ko‘rsatib, ob'ektning indeksatoriga murojaat qilishingiz mumkin. Masalan, familiyasi bo‘lgan ustunni olish uchun siz o‘quvchini ["Familiya"] yozishingiz kerak. Kvadrat qavs ichida biz satr shaklida biz kerak bo‘lgan ustun nomini ko‘rsatamiz va ob'ekt shaklida uning qiymatini olamiz. Ushbu usul yaxshi, ammo samarali emas. Gap shundaki, natijalar to‘plamida kerakli maydonni qidirish uchun har safar maydonni uning nomi bo‘yicha izlash kerak. Bu dastur uchun etarli, ayniqsa sizning kodingizda nomlar bo‘yicha maydonlarga ko‘plab qo‘ng‘iroqlar bo‘lsa. Ma'lumotni nomidan olish o‘rniga, ustun indeksini ishlatishingiz mumkin. Ushbu usul ancha tez ishlaydi va OleDbDataReader-da indeks ma'lumotlarini olishning ko‘plab usullari mavjud, ammo ular bundan keyin ham muhokama qilinadigan kamchiliklardan xoli emas. Keling, indeks bo‘yicha ma'lumot olishning qanday usullarini ko‘rib chiqaylik. Ustun qiymatlarini GetValue () usuli yordamida ham olish mumkin. Ushbu usul siz qiziqtirgan ustunning indeksidan o‘tishi kerak. Ushbu usul oldingi misolda ham qo‘llaniladi. Men faqat familiyani indeksator orqali olaman. Boshqa barcha qiymatlarni men GetValue () usuli orqali olaman.
O‘zingizning massivlaringiz bilan ishlash qulayroq bo‘lsa yoki bunday ehtiyoj paydo bo‘lsa, GetValues () usulidan foydalanishingiz mumkin. Ushbu usul natijalar qiymatlari tarkibini ob'ektlar qatoriga nusxalashadi. Parametr sifatida, usul boshlang‘ich qatordan o‘tishi kerak. Massiv qiymatlari soni natijadagi maydonlar soniga teng bo‘lishi kerak. Mumkin va kamroq, bu xatoga olib kelmaydi. Massivda qiymatlar mavjud bo‘lganidek, ko‘plab maydonlar to‘ldiriladi. Natijada hosil bo‘lgan maydonlar sonini FieldCount mulki orqali topish mumkin.
Ushbu usuldan qanday foydalanishni quyidagi misol ko‘rsatib turibdi: Object [ ] row = perg Object [reader. FieldCount); reader.GetValues (qator);
Kodning birinchi qatorida natijalarni saqlash uchun bir qator ob'ektlar ishga tushiriladi, ikkinchi qatorda GetValues () usuli qo‘llaniladi. Natijada, usul ko‘chirilgan maydonlar sonini qaytaradi.Ammo universal 0bject sifatida ma'lumotlar bilan ishlash har doim ham qulay emas. Masalan, bizning vaziyatimizda, uchinchi maydon - bu sana, toString () usulidan foydalanib, sana ob'ekti qatoriga olib kelish "har doim ham chiroyli echim emas". Va agar siz ushbu sana bilan aynan sana bilan ishlashingiz kerak bo‘lsa? Muammo juda oson hal qilinadi , ma'lum bir ma'lumot turida ma'lumotlarni qaytaradigan maxsus usullardan foydalanish kerak. Masalan, qiymatni sana sifatida olish uchun GetDateTime () usulidan foydalanishingiz mumkin: reader.GetDateTime (3)
Keling, qiymatlarni olish uchun yana qanday usullar borligini ko‘rib chiqamiz. Barcha usullar parametr sifatida qaytariladigan maydon indeksini qabul qiladi:
GetBoolean () - maydonning qiymatini Boolean qiymati sifatida qaytaradi;
GetByte() - maydon qiymatini bayt sifatida qaytaradi;
GetChar() - maydonning qiymatini char belgisi sifatida qaytaradi;
GetDecimal() - maydon qiymatini satr sifatida qaytaradi.
GetDouble() - maydon qiymatini suzuvchi nuqta raqami sifatida qaytaradi;
GetString() - maydon qiymatini Decima2 raqami sifatida qaytaradi;
Bular barcha usullardan uzoqdir. Deyarli har bir ma'lumot turi uchun ularning ko‘pi bor va ularning hammasi GetTipData () shakliga ega.
Maydonga indeks bo‘yicha kirishning asosiy kamchiligi moslashuvchanlikni yo‘qotishdir. Agar so‘rovdagi maydonlar ketma-ketligini o‘zgartirishga yoki so‘rovdan biron bir maydonni olib tashlashga qaror qilsangiz, kodni o‘zgartirishingiz kerak bo‘ladi. Jadvalning tuzilishini o‘zgartirganda muammolar paydo bo‘lishi mumkin. Masalan, Listing 1.0 kodida jadvalning barcha maydonchalari yulduzcha bilan tanlangan (SELECT *). Agar siz jadvalning tuzilishini o‘zgartirsangiz, so‘rov ma'lumotni noto‘g‘ri tartibda qaytarishi mumkin va indeksga kirish 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. Ko‘rinib turibdiki, biz qiymatlarga kirish uchun nimani ishlatishni tanlashimiz kerak - maydon nomlari yoki indekslar. Birinchi holda, biz mahsuldorlikni yo‘qotamiz, ammo moslashuvchanlikda yutamiz, ikkinchi holatda esa, aksincha.
Aslida, men hali ham dalalarga nomlar bo‘yicha kirishni tavsiya qilaman. Tezlikdagi yo‘qotish unchalik katta emas, shuning uchun bu muammoni e'tiborsiz qoldirish mumkin. O‘rta zamin topishga harakat qilishingiz yoki optimallash usullaridan foydalanishingiz mumkin. Masalan, bitta maydonga bir nechta qo‘ng‘iroqlar bo‘lsa, siz boshida maydon indeksini uning nomi bilan aniqlab, keyin indeks orqali kirishingiz mumkin. Nom bo‘yicha ustun indeksini aniqlash uchun GetOrdinal () usulini ishlatishingiz mumkin, u satrni parametr sifatida oladi va raqamli indeksni qaytaradi.
Masalan:
int nameIndex = reader , Getordinal ( “ Имя ”) ; reader .GetValue (nameIndex) ;
Birinchi satrda biz indeksni aniqlaymiz, keyin kerakli indeks orqali kerakli qiymatga kirishimiz mumkin.Ushbu kod eng universal hisoblanadi va unumdorligini yo‘qotmaydi. Dala indeksini aniqlash sikllarda yaxshi ishlaydi. Masalan:
OleDbDataReader reader = command.ExecuteReader();
Int lastnameIndex = reader.GetOrdinal(“Имя”);
// bu erda boshqa sohalarning ko‘rsatkichlarini aniqlash mumkin
while(reader.Read())
{
ListViewItem item =
listView1.Items.Add(reader.GetValue(lastnameIndex).ToString());
// bu erda boshqa maydonlardan foydalanish bo‘lishi mumkin
}
So‘rov tugagandan so‘ng, ishlatiladigan maydonlarning ko‘rsatkichlari aniqlanadi. U sikldan oldin amalga oshiriladi, shuning uchun har safar tsikl ichidagi indekslarni belgilashingiz shart emas.
Agar siz qidirish maydonidan bir marta ham foydalanishni xohlamasangiz, unda raqamli indekslar o‘rniga konstantalarni ishlatishingiz mumkin:
const int NAME_INDEX = 2;
…
Item.SubItems.Add(reader.GetValue(NAME_INDEX).ToString());
Bunday holda biz ishlashga erishamiz, lekin siz strukturani o‘zgartirganda, bajariladigan fayl hali ham qayta to‘ldirilishi kerak bo‘ladi. To‘g‘ri, uni tuzatish ancha oson bo‘ladi. Konstantalarning qiymatlarini tuzatish va bajariladigan faylni qayta yozish kifoya.
Va baribir, ushbu optimallashtirishga borishdan oldin, sizga juda yaxshi o‘ylashingizni maslahat beraman - sizga kerakmi? Bunday optimallashtirish murosa va moslashuvchanlik o‘rtasidagi kurashdir.
Ilovani ishga tushiring va ism va familiya maydonlariga e'tibor bering. Mening ustunlarim unchalik keng emas, lekin barcha ismlar va familiyalar ustunlar kengligiga mos keladi. Nima uchun nuqta o‘ng tomonda paydo bo‘ldi? Gap shundaki, standartga muvofiq char tipidagi maydonlar ular uchun to‘liq ajratilgan maydonni egallashi kerak. Agar chiziq belgilangan o‘lchamdan kichikroq bo‘lsa, o‘ng tomonga to‘liq uzunlikdagi bo‘shliqlar qo‘shiladi. Mening holatimda, ism va familiyaning o‘lchamlari uchun 50 ta belgini tanladim, shuning uchun o‘ng tomonda juda ko‘p bo‘sh joy bo‘ladi.
Ma'lumotlar bazasi bizning satrlarimizga qo‘shgan bo‘sh joylarni ko‘rish uchun maydonning oxiriga belgi qo‘shishga harakat qilib ko‘rishingiz mumkin:
ListViewItem item =
listView1.Items.Add(reader[“Фамилия”].ToString() + “ | “);
Bu erda familiyani ko‘rsatayotganda, maydon qiymatining oxiriga vertikal chiziq qo‘shiladi. O‘ngdagi bo‘shliqlarni kesish uchun siz birinchi muhim belgi chizig‘ining o‘ng tomonidagi barcha bo‘shliqlarni olib tashlaydigan usuldan foydalanishingiz mumkin. Shunday qilib, ko‘rinishga chiziq qo‘shish quyidagicha bo‘ladi:
listView1.Items.Add(reader[“Фамилия”].ToString().TrimEnd());
|