OleDbCommand Metodi
Ushbu bo‘limda biz OleDbCornmand sinf usullarini chuqurroq o‘rganamiz. Ekskursiya qisqa muddatli bo‘ladi, chunki usullar unchalik ko‘p emas, ammo juda qiziq, chunki sinfda juda qiziqarli usullar mavjud.
Joriy buyruq bajarilishini bekor qilishga urinadigan Cancel () usulidan boshlaymiz. Usul bajarishni bekor qilishi mumkinligi haqiqat emas, chunki har bir buyruq bekor qilinishi mumkin emas va usulning harakati ishlab chiqaruvchi tomonidan drayverni amalga oshirishga bog‘liq. Agar buyruq so‘rovni bajarish va natijani olish jarayonida bo‘lsa, ushbu usul operatsiyani bekor qilishi mumkin:
OleDbCommand command = connection.CreateCommand();
// buyruq ob'ekti parametrlarini sozlash
OleDbDataReader reader = command.ExecuteReader();
Command.Cancel();
Sizning e'tiboringizga loyiq bo‘lgan quyidagi usullar CreateDbParameter () va CreateParameter (). Variantlardan birinchisi DbConnand ajdodlari sinfidan meros bo‘lib o‘tgan. Ikkala usulning ham ma'nosi buyruq parametrlari to‘plamiga yangi parametr qo‘shishdir. Meros qilib olingan usul DbParameter ob'ekti shaklida parametr yaratadi, bu biz uchun unchalik zarur emas. OleDbConuana sinfining so‘rov parametrlari OleDbparaneter turiga kiradi va shuning uchun siz ushbu turdagi parametrni yaratadigan CreateParameter () usulidan foydalanishingiz kerak.
Prepare () usuli serverda so‘rov yoki protsedurani tayyorlashga imkon beradi. Agar buyruq protsedurani bajarsa, protsedurani bajarishga tayyorlash serverga tezroq ishlashi uchun protsedurani tuzishga imkon beradi. Aslida, protsedura birinchi qo‘ng‘iroq paytida ham kompilyatsiya sodir bo‘ladi, shuning uchun birinchi qo‘ng‘iroq biroz ko‘proq vaqt talab qilishi mumkin. Oldindan Prepare () usulidan foydalanib, oldindan kompilyatsiya qilishingiz mumkin.
Aslida, ma'lumotlarni olish uchun so‘rovlar uchun server keshda saqlanadigan bajarilish rejasini tuzishi kerak. Parametrlangan so‘rovlar bilan birgalikda bu samaradorlikni oshirishga olib kelishi mumkin. Hozirgacha biz parametrlarni faqat protseduralarga o‘tkazdik, ammo oddiy so‘rovlar bilan parametrlardan foydalanish mumkin. Bajarish rejasini bir marta yaratgandan so‘ng, server faqat parametrlar o‘zgartirilgan bir xil so‘rovlarni tezroq bajaradi.
Quyidagi misolda ma'lumotlarni olish uchun oddiy so‘rovda qanday parametrlardan foydalanish mumkinligi ko‘rsatilgan:
OleDbCommand command = connection.CreateCommand();
command.CommandText = “SELECT * FROM Peoples WHERE Фамилия LIKE?”;
command.Parameters.Add(@lastname”, OleDbType.Wchar, 50);
command.Parameters[0].Value = “Смирнов”;
OleDbDataReader reader = command.ExecuteReader();
CommandText parametri tayinlangan so‘rovda familiyasi savol belgisiga teng bo‘lgan barcha odamlar tanlanadi. Savol - bu parametr, biz saqlangan protsedura uchun belgilangan parametr bilan bir xil. Xuddi shu tarzda, uning uchun qiymat belgilanadi.
So‘rov bir necha parametrlarga ega bo‘lishi mumkin va ularni Parametrlar to‘plamiga ular so‘rovda paydo bo‘ladigan ketma-ketlikda qo‘shilishi kerak.Siz parametrlar ketma-ketligini kuzatmaslik uchun so‘rovda nafaqat savollarni, balki nomlangan parametrlarni ham belgilashingiz mumkin. Nomlangan parametr quyidagidan boshlanadi:
command.CommandText = “SELECT * FROM Peoples WHERE Фамилия LIKE @lastname”;
command.Parameters.Add(@lastname”, OleDbType.Wchar, 50);
Ushbu misolda, so‘rovda @lastname parametr nomi mavjud va parametr qo‘shish usulidan foydalangan holda aniq nom bilan parametr qo‘shilgan. Men savollardan foydalanishni afzal ko‘raman, shuning uchun keyinchalik ushbu kurs ishida men ularni hamma joyda ishlataman. Bu nomlanmagan parametrlar yaxshiroq degani emas, men aytaman, aksincha yomonroq. Noma'lum parametrlar bilan so‘rovni o‘zgartirganda, qo‘shilgan parametrlar so‘rovga mos kelishini nazorat qilishingiz kerak. Hali ham nomlangan variantlardan ko‘proq foydalanishni maslahat beraman.
CommandType xossasi yana bir mumkin bo‘lgan qiymatga ega - CommandType.TableDirect. Ushbu parametrning ma'nosi butun jadvalga kirishdir. Agar siz ushbu tanlovni tanlasangiz, unda zaxirada faqat kerakli jadvalning nomi ko‘rsatilishi kerak. Natijada, buyruq barcha jadvallarni va satrlarning barchasini qaytaradi, xuddi biz so‘rovni bajarganimiz kabi:
SELECT * FROM jadval
Kichkina jadval tarkibini to‘liq o‘qish kerak bo‘lganda, siz ushbu usuldan foydalanishingiz mumkin. Agar jadvalda juda ko‘p yozuvlar bo‘lsa va ularning soni yuz minglab bo‘lsa, unda jadval tarkibini tanlamaslik yaxshiroqdir. Ma'lumotni biron bir tarzda cheklash kerak. Foydalanuvchi barcha bu yozuvlarni birdaniga talab qilmaydi.
Quyidagi misol CommandType.TableDirect kabi buyruq yordamida amalda ma'lumotlarni qanday tanlashni ko‘rsatib beradi:
OleDbCommand command = connection.CreateCommand();
command.CommandText = “Peoples”;
command.CommandType = CommandType.TableDirect;
OleDbDataReader reader = command.ExecuteReader();
while(reader.Read())
{
// har doimgidek ma'lumotlarni o‘qing
}
Bu vaqt ichida biz ExecuteReader () metodi yordamida buyruqlarni bajarganmiz, lekin parametr sifatida CornandBehavior raqamlash turidagi o‘zgaruvchini oladigan boshqa usul ham mavjud. Ushbu ro‘yxat quyidagi qiymatlardan iborat:
Default - bir nechta natijalarni olish va har qanday so‘rovlarni bajarish imkonini beruvchi standart qiymat;
SingleResult - bir nechta to‘plam talab qilingan bo‘lsa ham, bitta natijani qaytaring;
SchemaOnly - so‘rov faqat sxema haqidagi ma'lumotni, ya'ni ustunlar to‘g‘risidagi ma'lumotlarni qaytaradi;
KeyInfo - so‘rov ustun va asosiy kalit haqidagi ma'lumotlarni qaytaradi;
SingleRow - so‘rov faqat bitta qatorni qaytarishi kerak;
CloseConnection - ma'lumotlar o‘quvchi yopilganda, tegishli server ulanish ob'ekti avtomatik ravishda yopiladi.
Uzilgan ma'lumotlar.
Hozirgacha ma'lumotlar bilan ishlayotganda, biz satrlarni o‘qiy olishimiz uchun ulanishni ochiq saqlashimiz kerak edi. Faqat so‘rov natijasi bilan ish tugagandan so‘ng ulanish yopilishi mumkin edi. Bu har doim ham qulay emas. Ma'lumot olish, ulanishni yopish va natijani xotirjam qayta ishlash yaxshi bo‘lar edi. Bu, ayniqsa, hisobotlarni tuzishda juda muhimdir, foydalanuvchi ularni uzoq vaqt ko‘rishi mumkin, shuningdek foydalanuvchi foydalanuvchi ma'lumotlar to‘plamini uzoq vaqt davomida tahrirlaganda va serverga kiritilgan buyruqlarni bitta buyruq bilan yuklaganida qulaydir. Faqatgina ma'lumotlar noqulay bo‘lishi mumkin. juda ko‘p.
Ulanishni o‘chirish va ma'lumotlar bilan lokal ravishda ishlash uchun biz ushbu ma'lumotlarni mahalliy buferga (RAM ichiga) o‘qib chiqishimiz va server xotirasidan foydalanmasdan allaqachon xotirada joylashgan ma'lumotlar bilan ishlashimiz kerak. Agar so‘rov natijasi 10 Gb ma'lumotni oladigan bo‘lsa, unda bu hajmning barchasini nusxalash o‘z joniga qasd qilishdir. RAM yetarli emasligi (ma'lumotni mahalliy diskdagi faylda saqlash mumkin) emas, balki o‘z-o‘zidan nusxalash server va tarmoqqa juda katta yukni yaratadi. Mijoz haqiqatan ham bunday hajmga muhtojmi yoki yo‘qligini ko‘rib chiqishga arziydi va foydalanuvchi ma'lum miqdordagi satrlarni tanlay olmasligi uchun siz biron-bir dasturiy himoyani amalga oshirishingiz kerak bo‘lishi mumkin.
Agar ma'lumotlar faqat yuz satrda o‘lchanadigan bo‘lsa, ularni mijoz kompyuteriga yuklab olish va RAMga joylashtirish hech qanday muammo tug‘dirmaydi. Ma'lumot uchun biz faqat biron-bir saqlashga muhtojmiz va nusxalash usulini yozishimiz kerak. Aslida, ma'lumotlarni saqlash uchun dinamik massiv va serverdan ma'lumotlarni o‘qish uchun oddiy ko‘chadan foydalanib, hamma narsa osongina echiladi, ammo yaxshiroq usul mavjud. ADO.NET allaqachon barcha kerakli sinflar va usullarni amalga oshiradi; ma'lumotni keshlashni soddalashtirish, bu bizga serverdan chiqib ketishga imkon beradi. Ma'lumotlar ulanmagan, shuning uchun biz ko‘rib chiqadigan sinflar biz boshlaydigan OleDbDataAdapterni hisobga olmaganda, serverga faol ulanishni talab qilmaydi.
OleDbDataAdapter sinfi - ma'lumotlarni keshlash uchun barcha kerakli usullarni amalga oshiradigan adapter sinfidir. Ammo u keshlash harakatlarini amalga oshiruvchi provayder. Keshni saqlash DataTable yoki DataSet sinflaridan biri bo‘lishi mumkin. Birinchisi bitta jadvalning keshini amalga oshiradi, ikkinchisi - ma'lumotlar to‘plami va ko‘plab jadvallardan iborat bo‘lishi mumkin. Buning uchun DataSet sinfida DataTable jadvallari to‘plami bo‘lgan Tables xususiyati mavjud. Agar sizning natijangiz bir nechta ma'lumotlar to‘plamini qaytarsa, unda ma'lumotlarni saqlash uchun DataSet sinfidan foydalanish mantiqan to‘g‘ri keladi. Biz undan universal sifatida foydalanamiz va sizga ham shunday qilishni maslahat beraman.
OleDbDaeaAdaptet sinfiga qaytish. Uning ikkita asosiy usuli - Fill () va Update (). Birinchi usul so‘rov natijalaridan olingan barcha ma'lumotlarni DataSet-ga nusxalash, ikkinchisi esa serverga qayta yuklash imkonini beradi. Bunday holda, 01eDbDaeaAdapeer klassi o‘zi belgilangan buyruqni bajaradi, shuning uchun uni mustaqil ravishda ochishning hojati yo‘q.
Ma'lumotni ajratish qanday kodga o‘xshashligini ko‘rib chiqaylik:
OleDbCommand command = new OledbCommand(SELECT * FROM Peopes”);
command.Connection = connection;
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
connection.Close();
Buyruqni yaratgandan so‘ng biz OleDbDataAdapter yutass misolini yaratamiz. Massa dizayneri faqat bitta parametrni bajarishi kerak - bajarilishi kerak bo‘lgan va natijasini nusxalash kerak bo‘lgan buyruq ob'ekti.
Endi nusxa ko‘chirish amalga oshiriladigan DataSet ob'ekti yarating.Bu sinfda biz odatiy konstruktordan foydalanamiz, bu erda sozlamalar kerak emas. Biz nusxa olishga tayyormiz. Buning uchun biz adapter sinfining Fill () usulini chaqiramiz va unga ma'lumotlar ko‘chirilgan DataSet ob'ektini beramiz.
Ushbu misolda biz buyruq ob'ektini ochmayotganimizga e'tibor bering. ExecuteXxxxx biron bir usuliga qo‘ng‘iroq yo‘q (bu shunchaki emas, bu zarur. Agar siz ExecuteReader () usulini chaqirsangiz, buyruq ob'ekti ochiladi va bu siz adapterni ishlatmoqchi bo‘lganingizda ajoyib vaziyatga olib keladi.
Shundan so‘ng, serverga ulanish yopilishi mumkin, endi kerak emas. Barcha ma'lumotlar DataSet-da lokal ravishda joylashgan va siz u bilan ishlashingiz mumkin.
Yuqoridagilarga ishonch hosil qilish uchun keling, bitta juda qiziqarli, ammo ma'lumotli misolni yozaylik. WinForms yangi dasturini yarating va forma ustiga DataGridView komponentini joylashtiring va uni asboblar panelidagi ma'lumotlar bo‘limida topishingiz mumkin. Ushbu tarkibiy qismni mog‘or yuzasiga yopishtiring. DataGridView komponentasi - jadvalda berilgan ma'lumotlar panjarasi. Shaklda Single 2.0 biz hozir yozayotgan panjara bilan ishlaydigan dastur misolini ko‘rsatadi.
Single 2.0 Ma'lumotni panjara shaklida ko‘rsatish
Siz shuningdek, BilingSource komponentini xuddi o‘sha Toolbox qismida joylashgan formaga joylashtirishingiz mumkin, ammo bu komponent vizual emas. Formaga xalaqit bermasligi uchun vizual bo‘lmagan qismlarni qo‘lda yaratishni afzal ko‘raman, shuning uchun forma sinfiga yangi BindingSource sinf o‘zgaruvchisini qo‘shdim va darhol ishga tushdim:
Private BindingSource bindingSource = new BindingSource();
BindingSource klassi yana bir vositachi, ammo bu safar DataSet va vizual komponentlar o‘rtasida. Bizning holatda, vizual tarkibiy qism DataGridView panjara bo‘lib, ma'lumotlarni aks ettirish uchun bizga BindingSource shaklida vositachi kerak bo‘ladi.
Sinf konstruktorida rnitia InitializeComponent () ni chaqirgandan so‘ng, ReadData () usuliga qo‘ng‘iroq qo‘shing. ReadData () usulining kodi ham yozilishi kerak va u Listing 16.6 da ko‘rsatilgandek ko‘rinadi.
|