5. DataSet yordamida ma’lumotlarni o`qish. DataSet bilan jadval, ustun va satrlarga murojaat. DataSet va DataTable. Ma'lumotlar bazasidan SqlDataAdapter orqali DataSet-da ma'lumotlarni olgandan so'ng, biz ulanishdan qat'i nazar, ushbu ma'lumotlar bilan mahalliy ravishda ishlashimiz mumkin. Bundan tashqari, agar biz biron bir ma'lumotlar bazasidan foydalanishga hojat yo'q bo'lsa, lekin ayni paytda jadvallar to'plami shaklida ma'lumotlar bilan ishlash uchun qulay funktsiyaga ega bo'lishni istasak, unda biz DataSet klassidan ham foydalanishimiz mumkin.
DataSet ob'ekti DataTable turi bilan ta'minlangan jadvallarni o'z ichiga oladi. O'z navbatida, jadval ustunlar va satrlardan iborat. Har bir ustun DataColumn ob'ekti, satr esa DataRow ob'ekti. Qator ma'lumotlari ItemArray xususiyatida saqlanadi, bu ob'ektlarning qatorini - satrdagi alohida hujayralarning qiymatlarini anglatadi. Masalan, biz barcha jadvallarni olamiz va ularning tarkibini ko'rsatamiz:
static void Main(string[] args) { string sql = "SELECT * FROM Users"; string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); DataSet ds = new DataSet(); adapter.Fill(ds); // перебор всех таблиц foreach (DataTable dt in ds.Tables) { Console.WriteLine(dt.TableName); // Jadval nomlanishi // перебор всех столбцов 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(); } } } }
Endi DataSet va DataTable ob'ektlari bilan qandaydir ma'lumotlar bazasini ishlatmasdan qanday ishlashimiz mumkinligini ko'rib chiqamiz. Masalan, biz DataSet-da qo'lda bir nechta jadval yaratamiz va ularning tarkibini aniqlaymiz:
static void Main(string[] args) { DataSet bookStore = new DataSet("BookStore"); DataTable booksTable = new DataTable("Books"); // dataset ga jadval qo'shing bookStore.Tables.Add(booksTable); // Books jadvali uchun ustunlar yarating DataColumn idColumn = new DataColumn("Id", Type.GetType("System.Int32")); idColumn.Unique = true; // ustun noyob qiymatga ega bo'ladi idColumn.AllowDBNull = false; // nullni qabul qila olmaydi idColumn.AutoIncrement = true; // avtomatik kattalashtirish idColumn.AutoIncrementSeed = 1; // boshlang'ich qiymati idColumn.AutoIncrementStep = 1; // yangi satr qo'shishda o'sish. DataColumn nameColumn = new DataColumn("Name", Type.GetType("System.String")); DataColumn priceColumn = new DataColumn("Price", Type.GetType("System.Decimal")); priceColumn.DefaultValue = 100; // standart qiymat DataColumn discountColumn = new DataColumn("Discount", Type.GetType("System.Decimal")); discountColumn.Expression = "Price * 0.2"; booksTable.Columns.Add(idColumn); booksTable.Columns.Add(nameColumn); booksTable.Columns.Add(priceColumn); booksTable.Columns.Add(discountColumn); // books jadvalining asosiy kalitini aniqlang booksTable.PrimaryKey = new DataColumn[] { booksTable.Columns["Id"] }; DataRow row = booksTable.NewRow(); row.ItemArray = new object[] { null, "Война и мир", 200 }; booksTable.Rows.Add(row); // добавляем первую строку booksTable.Rows.Add(new object[] { null, "Отцы и дети", 170 }); // ikkinchi qatorni qo'shing Console.Write("\tИд \tНазвание \tЦена \tСкидка"); Console.WriteLine(); foreach (DataRow r in booksTable.Rows) { foreach (var cell in r.ItemArray) Console.Write("\t{0}", cell); Console.WriteLine(); } Console.Read(); }
Keling, barcha kodni tahlil qilaylik. Birinchidan, ma'lumotlar konstruktoriga berilgan DataSet va DataTable ob'ektlari yaratiladi. Keyin to'rtta ustun yaratiladi. Konstruktordagi har bir ustun ikkita parametrni oladi: ustun nomi va uning turi.
DataColumn idColumn = new DataColumn("Id", Type.GetType("System.Int32")); Bundan tashqari, Id ustuni uchun, ushbu ustunning qiymatlari noyob qiymatga ega bo'lishi kerakligi, nullni qabul qilmasligi kerakligi va yangi ob'ekt qo'shilganda ularning qiymati bittaga ko'payishi aniqlandi. Ya'ni, aksariyat ma'lumotlar bazalarida bo'lgani kabi, bu standart Id ustunidir. Keyinchalik, yana uchta ustun yaratiladi va Discount ustuni uchun Expression xususiyati ustun qiymatini hisoblash uchun ishlatiladigan ifoda ko'rsatiladi:
discountColumn.Expression = "Price * 0.2"; Ya'ni, bu holda, chegirma ustunining qiymati 0,2 ga ko'paytirilgan Price ustunining qiymatiga tengdir. Keyin, jadvalning boshlang'ich kaliti PrimaryKey xususiyati yordamida o'rnatiladi:
booksTable.PrimaryKey = new DataColumn[] { booksTable.Columns["Id"] }; Birlamchi kalit - bu Id ustunidir. Ammo biz kompozit kalitni yaratish uchun turli xil ustunlar to'plamidan foydalanishimiz mumkin. Jadval sxemasini aniqlagandan so'ng unga ikkita qator qo'shiladi:
DataRow row = booksTable.NewRow(); row.ItemArray = new object[] { null, "Война и мир", 200 }; booksTable.Rows.Add(row); // добавляем первую строку booksTable.Rows.Add(new object[] {null, "Отцы и дети", 170 }); BookTable.Rows.Add usulidagi qiymatlar to'g'ridan-to'g'ri ob'ektlar qatori yoki DataRow ob'ekti sifatida uzatilishi mumkin. Bunday holda, biz ustunlar jadvalidagi kabi to'liq qiymatlarni uzatishimiz kerak. Biroq, Idning birinchi ustuni avtomatik o'sish orqali o'rnatilgandan so'ng, biz nol qiymatini berishimiz mumkin - u baribir e'tiborga olinmaydi. Shuningdek, Discount ustunining oxirgi parametrini tashlab yuborish mumkin, chunki uning qiymati "Price * 0.2" ifodasi yordamida hisoblanadi. Bundan tashqari, biz Price ning uchinchi ustuni uchun qiymatni qoldirib ketamiz, chunki uda DefaultValue xususiyati mavjud, agar u hech qanday qiymat bo'lmasa, standart qiymatni belgilaydi:
booksTable.Rows.Add(new object[] {null, " Otalar va bolalar "}); Va oxirida, jadvalning satrlari bo'ylab takrorlanadi. Qo'shish bilan bir qatorda, biz boshqa operatsiyalarni strings yordamida amalga oshirishimiz mumkin. Masalan, biz indeks bo'yicha qator olishimiz mumkin:
DataRow row = booksTable.Rows[0]; //birinchi qator Qatorlarni indeks bo'yicha olgandan so'ng, siz uning kataklarini o'zgartirishingiz mumkin:
booksTable.Rows [0] [2] = 300; // birinchi qatorning uchinchi katagi 300 ga o'rnatildi Shuningdek, siz satrni o'chirishingiz mumkin:
booksTable.Rows.RemoveAt (1); // ikkinchi qatorni indeks bo'yicha o'chirish // olib tashlashning boshqa usuli DataRow row = booksTable.Rows [0]; booksTable.Rows.Remove (row); DataTable-ning Select () usulidan foydalanib, biz ma'lum bir mezonga mos keladigan qatorlarni osongina topamiz. Masalan, biz 120 dan oshadigan qatorlarni olamiz:
var selectedBooks = booksTable.Select("Price > 120"); foreach (var b in selectedBooks) Console.WriteLine("{0} - {1}", b["Name"], b["Price"]);