Listning 3.0 ListView-da ma'lumotlarni o‘qish usuli
|
Void ReadData()
{
// ma'lumotlar bazasiga ulanish va o‘qish buyrug‘ini bajarish
OleDbConnection connection = CreateConnection();
OleDbDataAdapter adapter = new OleDbDataAdapter(“SELECT * FROM Peoples”, connection);
Adapter.Fill(dataset);
Connection.Close();
// ustun nomlarini to‘ldirish
Foreach(DataColumn column in dataset.Tables[0].Columns)
listView1.Column.Add(column.Caption);
// ustun qatorini to‘ldirish
Foreach(DataRow row in dataset.Tables[0].Rows)
{
ListViewItem item = listView1.Items.Add(row.ItemArray[0].ToString());
For(int i = 1; i
item.SubItems.Add(row.ItemArray[i].ToString());
}
}
Eng qiziqarli narsa DataSet-da ma'lumotlarni olgandan keyin boshlanadi. Bizning ro‘yxat tarkibiy qismi to‘liq bo‘sh va ustunlar mavjud emas. Biz ro‘yxat ko‘rinishidagi ustunlarni so‘rov natijasidagi ustun nomlari bilan to‘ldirishimiz kerak. Buni amalga oshirish uchun null jadvalning ustunlar to‘plamidagi ustunlarga qarang. Davrning ichida ro‘yxatga sarlavha natija ustunining nomi bo‘lgan ustun qo‘shing:
Foreach(DataColumn column in dataset.Tables[0].Columns)
listView1.Columns.Add(Column.Caption);
Endi bizning tarkibiy qismimiz natija ma'lumotlarini olishga tayyor. Natijani ma'lumotlar to‘plamidan ro‘yxat ko‘rinishiga o‘tkazish uchun, barcha qatorlar bo‘ylab takrorlanadigan yana bir pastadirni ishga tushiring (null jadvalning Rows xususiyati). Ushbu qatorning ichiga yangi satr qo‘shing, uning nomi joriy qatorning ItemArray ro‘yxatining nol elementi bo‘ladi.
Bu ItemArray ro‘yxati nima? Bu joriy qatorning qiymatlarini saqlaydigan qator. Ushbu qatorda juda ko‘p element mavjud, chunki so‘rov natijalarida ustunlar ham mavjud. Ego shuni anglatadiki, joriy satr natijasining nol ustunini olish uchun biz ItemArray massivining nol elementiga murojaat qilishimiz kerak.Ro‘yxat ko‘rinishida chiziq yaratgandan so‘ng, men yana bir pastadirni boshlayman, u elementArray-dagi qolgan elementlarni oladi va ularni joriy ro‘yxat submementsi sifatida qo‘shadi.
Ushbu kod to‘g‘rimi? Amalda, natija kamida bitta ustunni qaytarishiga amin bo‘lsangiz, uni to‘g‘ri deb hisoblashingiz mumkin. Shaxsan men so‘rov natijasini tasavvur qilmayman, hech narsa qaytarilmaydi, hech bo‘lmaganda bitta ustun bo‘lishi kerak. Shuning uchun, ro‘yxat ko‘rinishida yangi qator qo‘shganda, men jasorat bilan qatorlar qatorining nol elementiga murojaat qilaman. ItemArray [0]. ToString (). Agar natijalar to‘plamida ustunlar bo‘lmasa, ItemArray [0] -ni chaqirish istisno holatni keltirib chiqaradi. Ammo men to‘plamlarni simsiz tasavvur etolmayman. Agar bajarmasangiz, so‘rov bo‘lmagan SQL buyrug‘i, ya'ni SELECT so‘rovi o‘rniga jadvallar yoki ma'lumotlarning tuzilishini o‘zgartiradigan buyruq.
Bu holda Dataset ma'lumotlar bazasidan foydalanish maqsadga muvofiqmi? Aslida emas, aslida biz avval ma'lumotlarni to‘plamga, so‘ngra ro‘yxat ko‘rinishida nusxalashimiz kerak. Ma'lum bo‘lishicha, bizning ma'lumotlarimiz ikki marta taqdim etiladi. Ushbu muammoni hal qilish mumkinmi? Oson! Siz shunchaki ListView komponentini virtual rejimda ishlatishingiz kerak.
Ikkinchi variant - DataReader-dan foydalanib ma'lumotlarni nusxalash, ma'lumotlar to‘plamiga emas, balki to‘g‘ridan-to‘g‘ri ro‘yxat ko‘rinishida. Bunday holda, xotiradagi ma'lumotlar faqat bir marta taqdim etiladi, ammo biz keshlash yangilanishlarini yo‘qotamiz. Ha, biz bunday funktsionallikni o‘zimiz yoza olamiz, lekin nima uchun g‘ildirakni ixtiro qilish kerak. Bunday holda, u oqlanmaydi. Mavjud sinflarning asl funktsional imkoniyatlarini, agar siz haqiqatdan ham foyda ko‘rsangiz, qayta yozish mantiqiy bo‘ladi. Bunday holda, virtualizatsiya nuqtai nazaridan variant men uchun ancha foydali va qulayroq ko‘rinadi.
Va nihoyat, men sizga foydali bo‘lishi mumkin bo‘lgan ma'lumotlar to‘plamining asosiy xususiyatlarini beraman:
CaseSensitive - jadvaldagi satrlarni taqqoslash harflar hisobga olinmasligini aniqlaydi;
DataSetName - Ma'lumotlar to‘plamiga nomlar bo‘yicha kirish mumkin bo‘lishi uchun ma'lumotlar to‘plamining nomini saqlaydi;
ExtendedProperties - Kengaytirilgan ma'lumotlar xususiyatlari
HasErrors - belgilangan jadvallarda xatolar bor yoki yo‘qligini aniqlaydi;
Locale - til, klaviatura sxemasi, sana formati va boshqalar saqlanadigan CultureInfo sinfi ko‘rinishidagi mintaqaviy sozlamalar haqida ma'lumot;
Relations - Ota-onalar va bolalar jadvallari bilan munosabatlarni saqlaydigan to‘plam.
Tables - ma'lumotlar bazasi jadvallari.
1.5.2. Class DataRow
Biz allaqachon bilamizki, ADO.NET-da ma'lumotlar qatori DataRow sinfi sifatida taqdim etiladi. Bu sinf juda ko‘p qiziqarli usullarni o‘z ichiga oladi, ulardan ba'zilari:
AcceptChanges() - satr ob'ekti o‘zgarishlarni qabul qilishga majbur qiladi. Ushbu usul chaqirilganda EndEdit usuli ham aniq nomlanadi. Agar RowState qator davlat mulki qo‘shilgan yoki o‘zgartirilgan bo‘lsa (ya'ni satr qo‘shilgan yoki o‘zgartirilgan) bo‘lsa, u holda u o‘zgarishsiz qoladi. Agar davlat o‘chirilgan bo‘lsa, unda chiziq o‘chiriladi;
BeginEdit () - satrni tahrirlashni boshlaydi. Chiziq tahrirlash rejimiga joylashtirilgan bo‘lib, unda voqealar vaqtincha o‘chirilgan bo‘lib, foydalanuvchiga bir vaqtning o‘zida bir nechta satrlarni qahramon uchun tetiklash tekshiruvlarini o‘tkazmasdan o‘zgartirishga imkon beradi, masalan, bitta satrdan ma'lum miqdordagi pulni olib tashlash va boshqa chiziqqa o‘sha qiymatni qo‘shish kerak. Pulni olib qo‘ygandan so‘ng, miqdor o‘zgaradi va tekshirish tetiklari ishlamasligi mumkin. Ushbu muammoni hal qilish uchun har ikkala satrni tahrirlash rejimiga qo‘yib, ularning har biri uchun BeginEdit () usulini chaqirib, pul o‘tkazmalarini amalga oshirishingiz mumkin.
Agar satr tahrirlash rejimida bo‘lsa, u satrga yozilgan eski qiymatni ham, yangi qiymatni ham saqlaydi. Tahrirlash rejimida har bir satr ikki o‘lchovli qator bilan ifodalanadi. Eski qiymatni ko‘rish uchun quyidagi qatorga murojaat qilish kerak:
row [0, DataRowVersion.Original];
Birinchi qavat sifatida kvadrat qavs ichida qator indeksini ko‘rsating, ikkinchi parametrda esa DataRowVersion ro‘yxatining asl qiymatini ko‘rsatishingiz kerak. Yangi qiymatni ko‘rish uchun, ikkinchi parametrda DataRowVersion.Proposed ro‘yxatining qiymatini ko‘rsatish kerak;
CancelEdit() - joriy satrni tahrirlashni bekor qiladi
RejectChanges() - o‘zgarishlarni bekor qiladi;
Delete() - joriy satrni o‘chiradi, haqiqiy o‘chirish amalga oshirilmaydi. Faqat RowState satrining holati O‘chirilgan deb o‘zgartiriladi. RemoveChanges () usulini chaqirgandan so‘ng o‘chirish amalga oshiriladi. Agar siz allaqachon RejalashChanges () usulini chaqirmagan bo‘lsangiz, RejectChanges () usulini chaqirib o‘chirishni bekor qilish mumkin. Agar qator ma'lumotlar to‘plamiga qo‘shilgan bo‘lsa-da, lekin ularni qabul qilish orqali "ChangeChanges ()" orqali qo‘ng‘iroq qilish orqali saqlanmagan bo‘lsa, u holda satr holati "Alohida" ga o‘zgaradi. O‘zgarishlarni saqlash usulini chaqirgandan so‘ng, qator haqiqatan ham ma'lumotlar to‘plamidan o‘chiriladi;
EndEdit() - ma'lumotlarni tahrirlash rejimida to‘liq ishlash;
IsNull() - Agar parametr sifatida ko‘rsatilgan ustun NULL bo‘lsa, usul haqiqiy qiymatni qaytaradi. Ma'lumotlar bazasida NULL qiymati nolga tenglashtirilmaydi, shuning uchun siz ustun qiymatini nol raqami yoki bo‘sh satr bilan taqqoslay olmaysiz. Ustunning NULL ga tengligini aniqlash uchun ushbu usuldan foydalaning. Parametr sifatida, usul ustun nomi yoki indeksni, shuningdek DataColumn ob'ekti sifatida ustunni olishi mumkin;
SetNull() - ustun qiymatini nolga o‘zgartiring
Bular ma'lumotlar bazalari bilan ishlash uchun o‘z dasturlaringizni yaratishda foydali bo‘lishi mumkin bo‘lgan asosiy usullar,
Ma'lumotni boshqarish usullari ma'lumotlar bazasidagi haqiqiy ma'lumotlar bilan emas, balki faqat DataSet ma'lumotlari bilan ishlaydi. Sekundda yozilgan misolni ochishga harakat qiling. 6.1-bob, va taqdimotni ma'lumotlar bilan to‘ldirishdan oldin quyidagi ikkita satr kodini kiriting:
Dataset.Tables[0].Rows[0].Delete();
Dataset.Tables[0].Rows[0].AcceptChanges();
Bu erda biz ma'lumotlar to‘plamidan nol qatorni olib tashlashga va o‘zgarishlarni qabul qilishga harakat qilmoqdamiz. Jadval ma'lumotlar to‘plamidan o‘chiriladi, ammo jadvalda yo‘q. Buni tekshirish uchun dasturni ishga tushiring va ko‘rinishda nol qator bo‘lmaydi. Agar siz yana dasturni ishga tushirsangiz, qatorlar soni o‘zgarmaydi, ya'ni keyingi o‘chirish amalga oshirilmadi. " Va aniqroq aytganda, xuddi birinchi qatorda bo‘lgani kabi, yana bitta satr o‘chirildi.
Endi ma'lumotlar to‘plamidan satrlarni o‘chirish kodini olib tashlash va dasturni ishga tushirishga harakat qiling. Birinchi qator o‘z joyiga qaytadi va ko‘rinishda ko‘rinadi. Ya'ni, aslida u hech qachon ma'lumotlar bazasidan o‘chirilmagan. O‘zgarishlar nafaqat DataSet-da, balki ma'lumotlar bazasida ro‘y berishi uchun, biz 5-Reja singari o‘zgartirishlarni adapter orqali uzatishingiz kerak.
adapter.Update(dataset.Tables[0]);
Endi ma'lum bir ustun qiymatini o‘zgartirish misolini ko‘rib chiqaylik. Keyingi tsikl jadvaldagi barcha satrlar ustidan takrorlanadi, qatorni tahrirlash rejimiga qo‘yadi, birinchi ustunni o‘zgartiradi (ustunlar noldan raqamlanganligini unutmang) va ma'lumotlar to‘plamidagi o‘zgarishlarni saqlaydi:
Foreach(DataRow row in dataset.Tables[0].Rows)
{
row.BeginEdit();
row[1] =”Test”;
row.EndEdit();
}
Ushbu misoldagi o‘zgarishlar serverdagi jadvalda emas, balki DataSet-da saqlanadi. O‘zgarishlarni saqlash uchun siz adapterning Update () usulidan foydalanishingiz kerak.
1.5.3. Class DataColumn.
DataColumn sinfi ustun ma'lumotlarini saqlash uchun ishlatiladi. Jadvalda ushbu sinf ob'ektlari to‘plami bo‘lgan Columns xususiyati mavjud. Ushbu to‘plamning har bir elementida ustun (maydon) va unda saqlanishi mumkin bo‘lgan ma'lumotlar haqida etarlicha batafsil ma'lumotlar mavjud. Listing 3.0-da biz allaqachon ushbu to‘plamdan ustun nomlarini olish va ularni ro‘yxat ko‘rinishining sarlavhalarida ko‘rsatish uchun ishlatganmiz:
Foreach(DataCloumn column in dataset.Tables[0].Columns)
listView1.Columns.Add(Column.Caption);
Endi bu sinfga biroz ko‘proq kirishimiz kerak. Quyidagi xususiyatlar ustunlar uchun eng qiziq:
AllowDBNull - ustunlardagi ma'lumotlar nol (NULL) qiymatlarni saqlashi mumkinligini aniqlashga imkon beradi;
AutoIncrement - agar bu xususiyat to‘g‘ri bo‘lsa, satrlar qo‘shilganda ustun qiymati avtomatik ravishda oshadi;
AutoIncrementSeed - avtomatik ravishda oshiriladigan maydonning boshlang‘ich qiymati;
AutoIncrementStep - avtomatik ravishda oshiriladigan maydon uchun o‘sish qiymati;
Caption - maydon nomi
ColumnName - jadvalning ustunlar to‘plamidagi ustun nomi;
DataType - ma'lumotlar turi;
DefaultValue - standart qiymat
Expression - satrlarni filtrlash, ustundagi qiymatlarni hisoblash yoki umumiy maydonlar yaratish uchun ishlatilishi mumkin bo‘lgan ibora;
ExtendedProperties - unda o‘zboshimchalik bilan ma'lumotlarni saqlashga imkon beradigan qo‘shimcha xususiyatlar to‘plami, masalan, ma'lumotlarning ishlash muddati, yangilanish davri va boshqalar.
MaxLength - qiymatning maksimal uzunligi;
Ordinal - bu xususiyat kollektsiyada maydonning o‘rnini belgilaydi;
ReadOnly - maydon faqat o‘qish uchun mo‘ljallanganligini aniqlashga imkon beradi;
Table - ustun saqlanadigan jadvalga havola;
Unique - ushbu ustunning maydoni noyob bo‘lishi kerakligini aniqlashga imkon beradi.
Cheklovlar to‘g‘risida ma'lumot olish uchun siz adapter ob'ektining FillScheme () usulidan foydalanishingiz mumkin, ma'lumotlar to‘plami to‘ldirilgan Fill () usulidan farqli o‘laroq, FillScheme () usuli faqat serverdan diagrammani oladi. Agar ulanish to‘xtatilgan bo‘lsa, u adapter tomonidan tiklanadi va Se1ectCommand-dagi buyruq yordamida adapter xususiyatlarda o‘rnatilgan ma'lumotlardagi kontaktlarning zanglashiga oid ma'lumotlarni oladi va to‘ldiradi: AllowDBNull, AutoIncrement, AutolncrementSeed, AutoIncrenentStep, MaxLength, ReadOn1y, Unique. qo‘shimcha ravishda, boshlang‘ich kalitlar va cheklovlarni cheklash maydonchalari to‘ldirilgan va sozlangan.
|