16.17. Ma'lumotlarni manipulyatsiya qilish Biz asta-sekin ma'lumotlar bazalari bilan ishlash mavzusiga o'tmoqdamiz va ma'lumotlarni manipulyatsiya qilish masalasiga keldik. Biz bularning ba'zilarini ko'rib chiqdik va endi ba'zi usullarni takrorlashga to'g'ri keladi, chunki misollar yanada aniqroq va qiziqarli bo'lishi uchun ba'zi usullarni tahlil qilishimiz kerak edi. Endi biz ma'lumotlarni manipulyatsiya qilish masalalariga chuqurroq va batafsilroq kirishimiz kerak.
16.17.1. Satrlarni qo'shish Biz allaqachon bilamizki, DataGridView komponenti yordamida ma'lumotlarni tahrirlash mumkin, lekin ba'zida qiymatlarni dasturiy jihatdan o'zgartirish kerak bo'ladi. Ma'lumotlarni o'zgartirishning ikki yo'li mavjud - ularni buyruqlar bilan bajariladigan SQL so'rovlari yordamida o'zgartiring. Yoki o'zgarishlarni saqlash usuli chaqirilganda, o'zgarishlar keshlangan va serverga uzatiladigan jadvalning xususiyatlaridan foydalanishingiz mumkin.
SQL yordamida ma'lumotlarni manipulyatsiya qilish boshqa kitob uchun mavzu, ammo jadval xususiyatlaridan foydalanish bizga kerak bo'lgan narsadir. Keling, avval jadvalga qanday qilib qator qo'shish mumkinligini ko'rib chiqaylik. Buning uchun Sec-dan ConstraintProject misolini oching. 16.16 va shaklga tugma qo'shing, uni bosish orqali biz qator yaratamiz, uni ma'lumotlar bilan to'ldiramiz va jadvalga qo'shamiz. Tugma bosilganda bajariladigan kod shunday bo'lishi kerak:
private void addRowButton_Click(object sender, EventArgs e)
{
DataRow row = table.NewRow();
row[1] = "Sut";
row["Soni"] = 10;
row["Narxi"] = 16;
table.Rows.Add(row);
}
Kodning birinchi qatorida biz jadvalning NewRow() usulini chaqiramiz. Bu usul sxemasi jadvalga mos keladigan yangi qator hosil qiladi, ya'ni qatorda jadvalga mos keladigan maydonlar bo'ladi. Natijada yangi qator ob'ekt sifatida qaytariladi va DataRow ma'lumotlar turiga kiradi. Biz qiymatni keyinchalik foydalanish uchun o'zgaruvchida saqlaymiz.
Endi siz satrni qiymatlar bilan to'ldirishingiz kerak. Ustun qiymatlariga kirish uchun nomlar ham, indekslardan ham foydalanish mumkin. Indekslar tezroq va nomlar umumiyroqdir, chunki ular ma'lumotlar strukturasiga bog'liq emas. So'rov natijasi va jadval tuzilishi o'zgarganda, agar siz nomlar orqali maydonlar bilan ishlasangiz, misol ishlashni davom ettiradi.
Shunday qilib, satr qiymatlari Items maydonida saqlanadi, ularga ham Items xususiyati orqali, ham indeksator orqali kirish mumkin. Ushbu misolda men faqat indeksatordan foydalanaman, chunki u menga ko'proq yoqadi.
Maydonga indeks bo'yicha murojaat qilish uchun indeksni kvadrat qavs ichida raqam sifatida ko'rsatish kifoya. Yaratilgan qator uchun mahsulot nomini shunday o'rnatamiz:
row[1] = "Sut";
Ustun raqamlari noldan boshlab raqamlangan, lekin nol maydoni kalit, shuning uchun men uni o'rnatmayman. Lekin birinchi maydon mahsulot nomi bo'lib, biz uni o'zgartiramiz.
Misoldagi qolgan maydon qiymatlari nomlar orqali ko'rsatilgan. Masalan, quyidagi qator raqamni o'zgartiradi:
row["Soni"] = 10;
Misolni ishga tushiring va tugmani bosing. E'tibor bering, yaratilgan qator darhol tarmoqda paydo bo'ldi, garchi biz tarmoqni yangilashni so'ramagan bo'lsak ham. Hamma narsa avtomatik ravishda sodir bo'ldi.
Yangi qator qo'shishning yana bir usuli bor - LoadDataRow() usuli. Ushbu usul ikkita parametrni oladi: barcha ustunlar uchun qiymatlar massivi va o'zgartirishni qabul qilish kerakligini aniqlaydigan mantiqiy qiymat. Agar ikkinchi parametr rost bo'lsa, u holda qo'shgandan keyin AcceptChanges() usuli bajariladi, aks holda qator holati (RowState xususiyati) shunchaki Added ga o'zgartiriladi.
Ikkinchi parametr aniq, lekin bizning holatlarimizda birinchisi bilan nima qilish kerak? Birinchi parametr yangi satr maydonlari uchun qiymatlar massivi bo'lishi kerak. Bizning oxirgi ikkita ustunimiz hisoblab chiqilgan, ularga nima o'tkazilishi kerak? Hamma narsa. Siz istalgan raqamlarni kiritishingiz mumkin, ular qayta hisoblab chiqiladi. Men qiymatlari muhim bo'lmagan maydonlarda null qiymatlarni belgilashni afzal ko'raman, masalan, quyidagi misolda ko'rsatilganidek:
Object[] newRow = { null, "Сахар", 2, 23, null, null };
table.LoadDataRow(newRow, false);
Yana bir variant bor - massivdagi faqat kerakli maydonlarni to'ldirish va ko'rsatilmaganlar avtomatik ravishda nolga teng bo'ladi. Quyidagi misol faqat dastlabki uchta ustun uchun qiymatlari bo'lgan massivni yaratadi. Qolganlari nolga teng bo'ladi:
Object[] newRow = { null, "Shakar", 2 };
Jadvalga yangi qator qo'shsangiz va ushbu qatorni ma'lumotlar bazasida saqlashingiz kerak bo'lsa, LoadDataRow() usuli ikkinchi parametrda noto'g'ri sifatida ko'rsatilishi kerak. Bunday holda, qator yangi sifatida belgilanadi va adapter yangilash usulini chaqirganda, yangi satr qiymatlari InsertCommand xususiyati buyrug'i yordamida serverga uzatiladi. Agar ikkinchi parametr rost bo'lsa, chiziq o'zgarmagan deb belgilanadi, ya'ni adapterning Update usuli chaqirilganda InsertCommand buyrug'i bajarilmaydi va o'zgarishlar serverga o'tkazilmaydi.
Nima uchun ma'lumotlar to'plamida serverga o'tkazilmaydigan qatorlarni yaratishingiz kerak? Ba'zan, masalan, butun satrda saqlanmasligi kerak bo'lgan foydalanuvchi hisoblagan qiymatlar mavjud bo'lganda, bu haqiqatan ham kerak bo'ladi.