Ma'lumotlarni o'zgartirish so'rovlarini nazorat qilishimiz bizga ma'lumotlarni saqlash jarayoni
bo'yicha cheksiz imkoniyatlarni beradi. Aytaylik, bizda ikkita jadval bor. Birida odamlar haqidagi
ma'lumotlar, ikkinchisi esa ularning manzillarini o'z ichiga oladi. Bu juda mantiqiy vazifa, chunki
insonning yashash joyining manzili o'zgarishi mumkin va uning ma'lumotlarini alohida jadvalda
Bizning formamiz manzillarni ko'rsatishi uchun ma'lumotlarni o'qish adapteridagi so'rov
Siz misolni ishga tushirishingiz va manzil maydoni panjarada paydo bo'lishini tekshirishingiz
mumkin. Kerakli ma'lumotlar namunasini olish uchun bizga murakkab tana harakatlari kerak emas
edi. Ma'lumotlar o'zgarishlarini hozir qanday saqlashim mumkin? Bir vaqtning o'zida ikkita
jadvalga ma'lumotlarni saqlashi mumkin bo'lgan UPDATE so'rovi mavjud emas. Ammo bizni
ikkita YANGILASH so'rovini yozishga va ularni bitta buyruqqa qo'yishimizga kim to'sqinlik
qilmoqda? O'zgarishlarni qabul qiladigan va ularni jadvallar bo'ylab tarqatadigan protsedurani
yozishimizga kim to'sqinlik qilmoqda? Mutlaqo hech kim aralasha olmaydi. Biz to'g'ridan-to'g'ri
Server bitta buyruqda bir vaqtning o'zida ikkita so'rovni bajara olishi uchun biz bu buyruqlarni
nuqta-vergul yordamida ajratishimiz kerak. Bizning holatlarimizda u quyidagicha ko'rinadi:
adapter.UpdateCommand = new SqlCommand(
"UPDATE Peoples SET Фамилия = ?, Имя = ?, Пол = ? " +
"WHERE idKey = ?;" +
"UPDATE Address SET Адрес = ? " +
"WHERE idAddressKey = ?" ) ;
Endi buyruqda ikkita yangilash so'rovi mavjud. Birinchisi Xalqlar jadvalini, ikkinchisi esa
Manzillar jadvalini yangilaydi. Misol ishlashi uchun siz Manzillar jadvalini yangilash so'rovi bilan
bog'liq parametrlar to'plamiga ikkita parametr qo'shishni unutmasligingiz kerak:
adapter.UpdateCommand.Parameters.Add("Адрес",
SqlType.VarChar, 50, "Адрес");
adapter.UpdateCommand.Parameters.Add("idAddressKey",
SqlType.Integer, 10, "idAddressKey");
Endi bitta o'tishda biz bir vaqtning o'zida ikkita jadvalni yangilashimiz mumkin.
То, что у нас есть контроль над запросами изменения данных, предоставляет нам
неограниченные возможности над процессом сохранения данных. Допустим, что у нас есть
две таблицы. В одной находятся данные о людях, а во второй таблице находятся их адреса.
Вполне логичная задача, ведь адрес места жительства у человека может меняться, и за счет
хранения его данных в отдельной таблице мы можем сохранять историю перемещения
человека.
Запрос на выборку данных будет выглядеть следующим образом
SELECT *
FROM Peoples р, Address а
WHERE idKey = idPeopleKey
Чтобы наша форма отобразила адреса, достаточно только изменить строку запроса в
адаптере чтения данных:
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT * FROM Peoples p, Address a WHERE idKey = idPeopleKey",
connection);
Можете запустить пример и убедиться, что поле адреса появилось в сетке. От нас не
понадобилось никаких сложных телодвижений для получения необходимой выборки
данных. А как теперь сохранить изменения данных? Нет такого запроса
UPDATE
, который
мог бы сохранять данные сразу в две таблицы. Но кто мешает нам написать два запроса
UPDATE И
поместить их в одну команду? Кто мешает нам написать процедуру, которая будет
получать изменения и разносить их по таблицам? Абсолютно никто не может помешать. Мы
рассмотрим вариант с прямым выполнением UPDATE.
Для того чтобы сервер смог выполнить сразу два запроса в одной команде, мы должны
разделить эти команды с помощью точки с запятой. В нашем случае это будет выглядеть
следующим образом:
adapter.UpdateCommand = new SqlCommand(
"UPDATE Peoples SET Фамилия = ?, Имя = ?, Пол = ? " +
"WHERE idKey = ?;" +
"UPDATE Address SET Адрес = ? " +
"WHERE idAddressKey = ?" ) ;
Теперь в команде два запроса обновления. Первый обновляет таблицу Peoples, а второй
запрос обновляет таблицу Address. Чтобы пример заработал, нужно не забыть добавить в
коллекцию параметров два параметра, относящиеся к запросу обновления таблицы Address:
adapter.UpdateCommand.Parameters.Add("Адрес",
SqlType.VarChar, 50, "Адрес");
adapter.UpdateCommand.Parameters.Add("idAddressKey",
SqlType.Integer, 10, "idAddressKey");
Теперь в один проход мы сможем обновить сразу две таблицы.