SqlCommandBuilder va Ma'lumotlar bazasida DataSet o'zgarishlarini saqlash
DataSet-dagi ma'lumotlarni qabul qilib, biz u bilan turli xil operatsiyalarni bajarishimiz mumkin: o'chirish, o'zgartirish, yangi yozuvlarni qo'shish. Biroq, biz kiritgan barcha o'zgarishlar avtomatik ravishda ma'lumotlar bazasiga saqlanmaydi. Buning uchun biz hali ham DataSet-ni to'ldirgan SqlDataAdapter ob'ektining Update usulini chaqirishimiz kerak.
SqlDataAdapter ma'lumotlar bazasidagi ma'lumotlarni DataSetdagi o'zgarishlarga muvofiq o'zgartirish uchun InsertCommand, UpdateCommand va DeleteCommand buyruqlaridan foydalanadi. Ushbu buyruqlar uchun sql iboralarini o'zimiz belgilay olamiz yoki kerakli iboralarni avtomatik ravishda yaratish uchun SqlCommandBuilder sinfidan foydalanishimiz mumkin. SqlCommandBuilder-dan foydalanish:
static string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
static void Main(string[] args)
{
string sql = "SELECT * FROM Users";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
// добавим новую строку
DataRow newRow = dt.NewRow();
newRow["Name"] = "Alice";
newRow["Age"] = 24;
dt.Rows.Add(newRow);
// создаем объект SqlCommandBuilder
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
adapter.Update(ds);
// альтернативный способ - обновление только одной таблицы
//adapter.Update(dt);
// заново получаем данные из бд
// очищаем полностью DataSet
ds.Clear();
// перезагружаем данные
adapter.Fill(ds);
foreach (DataColumn column in dt.Columns)
Console.Write("\t{0}", column.ColumnName);
Console.WriteLine();
// перебор всех строк таблицы
foreach (DataRow row in dt.Rows)
{
// получаем все ячейки строки
var cells = row.ItemArray;
foreach (object cell in cells)
Console.Write("\t{0}", cell);
Console.WriteLine();
}
}
Console.Read();
}
Bu erda, ma'lumotlarni yuklagandan so'ng, yangi qator yaratiladi, keyin u DataTable-ga qo'shiladi. Adapterning Update () usuli chaqirilganda, sodir bo'lgan o'zgarishlar tahlil qilinadi. Va bundan keyin tegishli buyruq bajariladi. Bunday holda, yangi satr qo'shilayotganligi sababli, InsertCommand buyrug'i bajariladi. Biroq, ushbu kodda biz ushbu buyruqni aniq biron bir joyda o'rnatmaganmiz; SqlCommandBuilder biz uchun hamma narsani avtomatik ravishda amalga oshiradi. Ushbu sinfdan foydalanish uchun kerakli adapter o'tkazilgan uning konstruktorini chaqirish kifoya:
1
|
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
|
Kodning boshqa hech bir joyida siz ushbu ob'ektni chaqirmaysiz.
Agar kerak bo'lsa, ishlatilgan buyruqlarning sql ifodalarini olishimiz mumkin:
1
2
3
|
Console.WriteLine(commandBuilder.GetUpdateCommand().CommandText);
Console.WriteLine(commandBuilder.GetInsertCommand().CommandText);
Console.WriteLine(commandBuilder.GetDeleteCommand().CommandText);
|
Mening vaziyatimda yangilash buyrug'i quyidagicha ko'rinadi:
UPDATE [Users] SET [Name]=@p1, [Age]=@p2 WHERE (([Id]=@p3) AND ([Name]=@p4) AND ([Age]=@p5))
Qo'shish buyrug'i:
1
|
INSERT INTO [Users] ([Name],[Age]) VALUES (@p1, @p2)
|
Buyruqni o'chirish:
DELETE FROM [Users] WHERE (([Id]=@p1) AND ([Name]=@p2) AND ([Age]=@p3))
Ma'lumotlar bazasini DataSet-dan qo'lda yangilash
Garchi oldingi mavzuda SqlCommandBuilder ob'ekti ma'lumotlar bazasidagi ma'lumotlarni DataSet-dan yangilash uchun barcha kerakli iboralarni avtomatik ravishda yaratishga imkon bergan bo'lsa-da, bu usul hanuzgacha o'z kamchiliklariga ega. Masalan, oldingi satrda ishlatilgan quyidagi kod qismini ko'rib chiqing:
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
adapter.Update(ds);
ds.Clear();
adapter.Fill(ds);
Yangilanishdan so'ng DataSet o'chiriladi va ma'lumotlar qayta yuklanadi, bu dasturning ishlashini pasaytiradi. Biz DataTable-ga yangi ma'lumotlar qo'shilgan qatorni qo'shgan bo'lsak-da, unga faqatgina id - ma'lumotlar bazasi qo'shilganda hosil bo'ladigan qiymat etishmaydi. Id bo'lmasa, ma'lumotlarni boshqarish biz uchun qiyin bo'ladi, ularni o'sha SqlCommandBuilder orqali avtomatik ravishda yangilay olmaymiz yoki o'chira olmaymiz. Shuning uchun, ideal holda, biz ma'lumotlarni qayta yuklashdan saqlanishni va shu bilan birga adapter.Update usulini ishga tushirishda yangi yozuvning identifikatorini olishni xohlaymiz. Va yanada moslashuvchan usul - biz o'zimiz bajaradigan barcha iboralarni qo'lda belgilaymiz.
Shunday qilib, ma'lumotlar bazasiga quyidagi saqlangan protsedurani qo'shamiz:
CREATE PROCEDURE [dbo].[sp_CreateUser]
@name nvarchar(50),
@age int,
@Id int out
AS
INSERT INTO Users (Name, Age)
VALUES (@name, @age)
SET @Id=SCOPE_IDENTITY()
GO
Bu foydalanuvchi nomi va yoshini kirish parametrlari sifatida qabul qiladi va ularning identifikatorini qaytaradi.
Endi oldingi mavzudagi kodni o'zgartiramiz:
statik string connectionString = @ "Ma'lumotlar manbai =. \ SQLEXPRESS; Dastlabki katalog = usersdb; Integrated Security = True";
statik bo'sh joy Asosiy (string [] arglar)
{
string sql = "Foydalanuvchilardan * tanlang";
yordamida (SqlConnection ulanishi = yangi SqlConnection (connectionString))
{
ulanish.Ochiq ();
SqlDataAdapter adapter = yangi SqlDataAdapter (sql, ulanish);
SqlCommandBuilder commandBuilder = yangi SqlCommandBuilder (adapter);
// kiritish uchun buyruqni o'rnating
adapter.InsertCommand = yangi SqlCommand ("sp_CreateUser", ulanish);
// bu ishlaydigan protsedura bo'ladi
adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
// ism uchun parametr qo'shing
adapter.InsertCommand.Parameters.Add (yangi SqlParameter ("@ name", SqlDbType.NVarChar, 50, "Ism"));
// yoshga parametr qo'shish
adapter.InsertCommand.Parameters.Add (yangi SqlParameter ("@ age", SqlDbType.Int, 0, "Age"));
// id uchun chiqish parametrini qo'shing
SqlParameter parametri = adapter.InsertCommand.Parameters.Add ("@ Id", SqlDbType.Int, 0, "Id");
parameter.Direction = ParameterDirection.Output;
DataSet ds = yangi DataSet ();
adapter.Fill (ds);
DataTable dt = ds.Tables [0];
// yangi qator qo'shish
DataRow newRow = dt.NewRow ();
newRow ["Name"] = "Kris";
newRow ["Yosh"] = 26;
dt.Rows.Add (newRow);
adapter. Yangilash (ds);
ds.AcceptChanges ();
foreach (DataColumn ustunidagi dt.Columns)
Console.Write ("\ t {0}", column.ColumnName);
Console.WriteLine ();
// jadvalning barcha qatorlari bo'ylab takrorlang
oldingi (DataRow qatori dt.Rows-da)
{
// qatordagi barcha katakchalarni oling
var cells = qator.ItemArray;
foreach (hujayralardagi ob'ekt katakchasi)
Console.Write ("\ t {0}", katak);
Console.WriteLine ();
}
}
Console.Read ();
}
Bu SqlCommandBuilder-dan ham foydalanadi, lekin endi adapter.InsertCommand xususiyatini bekor qilish orqali yangi ob'ekt qo'shilishi bekor qilinadi.
Chiqish parametrini belgilashda biz unga "@Id" deb nom berilishini va DataTable-da Id ustuni uchun qiymatni qaytarishini aniqlaymiz:
1
|
adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id");
|
Natijada, adapter.Update () usuli bajarilganda id avtomatik ravishda DataTable-ga o'tadi. Bunday holda, yangilash va o'chirish operatsiyalari, biz SqlCommandBuilder tomonidan taqdim etilganlardan foydalanamiz.
Ma'lumotlar bazasini DataSet-ning AcceptChanges () usuli yordamida yangilagandan so'ng, DataSet-dagi barcha o'zgarishlar barcha o'zgartirilgan qatorlarga bog'liq.
Do'stlaringiz bilan baham: |