DataSet là lớp khung cơ bản cho thao tác dữ liệu với .NET Compact Framework. DataSet cĩ thểđược hiểu như một dụng cụ cơ sở dữ liệu quan hệ nhỏ trong chính nĩ. Nĩ lưu giữ các bảng trong bộ nhớ và được tổ chức thành các bảng, các hàng, và các cột, và nĩ cho phép những người phát triển thực hiện những thao tác cơ sở dữ liệu chuẩn, như
việc thêm và loại bỏ dữ liệu, sắp xếp, và kiểm tra những ràng buộc.
Làm việc với .NET Compact Framework khĩ hơn làm việc với desktop .NET Framework, bởi vì cĩ nhiều sự quá tải (overloads) khơng thể tìm thấy trên .NET Compact
Framework và nĩ dễ dàng làm cho quá trình hoạt động lộn xộn, làm cho quá trình thực thi kéo dài.
Tồn bộ chiến lược để xử lý dữ liệu trong lập trình ADO.NET là làm đầy một DataSet từ một cơ sở dữ liệu lớn, bao gồm cả việc lưu dữ liệu trong DataSet , và sau đĩ viết lại bất kỳ sự thay đổi nào cho cơ sở dữ liệu. Chương này bàn luận việc làm thế nào
để đưa dữ liệu vào DataSet bởi việc chèn dữ liệu theo chương trình và để thực hiện những thao tác đơn giản trên dữ liệu.
3.2.1 Tìm hiểu bên trong DataSet: DataTables, DataRows, và DataColumns.
DataSet chứa một hoặc nhiều DataTable. Mỗi DataTable tương ứng với một bảng trong cơ sở dữ liệu quan hệ. Nĩ cĩ một tập hợp các DataRow, và mỗi DataRow cĩ một tập các DataColumn mà nĩ thực sự lưu giữ dữ liệu. Để tạo ra các DataSet, DataTable, và DataColumn dễ dàng và dễ làm việc với chúng, ta đặt tên cho chúng. Hình 6.1 là sơđồ
khối miêu tả tồn bộ cấu trúc của một DataSet lưu dữ liệu cho một PhoneBook đơn giản.
Bạn cĩ thể sử dụng một DataTable để lưu dữ liệu được kết hợp với một bảng, nhưng DataSet cung cấp các phương thức và các thuộc tính mà cĩ thêm tiện ích và thực sự tạo ra một cơ sở dữ liệu quan hệ thu nhỏ trong bộ nhớ. Ví dụ, với DataSet bạn cĩ thể
làm tất cả những việc được nêu ở dưới đây:
• Thao tác với thơng tin ở trong một DataSet như một cơ sở dữ liệu quan hệ nhỏ.
Chẳng hạn, bạn cĩ thể thiết lập những mối quan hệ cha - con, cập nhật và xĩa, và tạo ra những cột dữ liệu mà được tính tốn từ những trường dữ liệu khác.
• Save hoặc load các nội dung của tất cả các DataTable vào một file XML với chỉ
một dịng lệnh
• Nĩ thơng qua bộ máy SQL CE, bộ máy này sẽ giúp chúng ta đưa vào nĩ các bảng
từ cơ sở dữ liệu quan hệ được lưu trữ trên thiết bị hoặc thay thế bằng dữ liệu từ
máy chủ từ xa.
• Thơng qua nĩ, SQL cung cấp đểđưa vào với các bảng từ một máy chủ từ xa.. • Nhận ở DataSet, cái mà trả về những giá trị của các Web service, hoặc thơng qua
DataSet để trở lại một Web service
3.2.2 Đưa dữ liệu vào trong một DataSet
Để đưa dữ liệu mới vào một DataSet, chúng ta cần thực hiện theo những bước sau:
1. Nhận một tên cho DataTable bên trong DataSet mà bạn muốn thêm hàng dữ liệu mới trong nĩ. Nếu cần thiết ta cĩ thể tạo mới một DataTable. Tập hợp các DataTable mà DataSet quản lý cĩ thể được sử dụng thơng qua thuộc tính DataSet.Tables. Nếu bạn phải tạo một DataTable mới và thêm nĩ vào tập hợp DataSet.Tables thì bạn sẽ đi theo những bước sau (thơng thường, bạn sẽ thêm dữ
liệu cho một bảng đã cĩ sẵn, vì vậy bạn cĩ thể bỏ qua các bước này): - Tạo một DataTable qua cấu trúc DataTable
- Tạo một các DataColumn và thêm chúng vào tập hợp DataTable.Columns. Với mỗi DataColumn mới, bạn phải chỉđịnh tên cho cột và kiểu dữ liệu của nĩ.
- Thêm DataTable mới cho tập hợp DataSet.Table bằng cách gọi đến phương thức .Add của nĩ.
2. Tạo một DataRow mới bằng cách yêu cầu DataTable tạo nĩ ra cho bạn. Ví dụ, để
tạo một hàng mới cho DataTable đầu tiên trong một DataSet ta sử dụng câu lệnh l_newRow = l_DataSet. Tables[0].NewRow. Ngồi ra, bạn cũng cĩ thể chỉ định bảng bằng tên, ví dụ : l_newRow = l_DataSet.Tables["Customers"].NewRow 3. DataRow mới được tự động tạo ra các cột tương ứng với bảng đã được tạo. Đưa
các giá trị vào trong các cột của DataRow
4. Thêm DataRow mới vào tập hợp Rows của DataTable đã được tạo. Ví dụ : l_DataSet.Tables[0].Rows.Add(l_newRow);.
5. Sau khi chúng ta đã cĩ tất cả các dịng như mong muốn, ta gọi DataSet.AcceptChanges để chấp nhận sự thay đổi. Để huỷ bỏ tất cả việc thêm mới dữ liệu ta gọi phương thức DataSet.RejectChanges
3.2.3. Xây dựng một DataSet lưu giữ một Phone Book
Để hiểu việc làm thế nào để tạo một DataSet cĩ khả năng lưu trữ dữ liệu quan hệ, chúng ta sẽ xem một vài dịng code mẫu của ứng dụng PhoneBook. Đây là ứng dụng mẫu
được giải thích rất chi tiết trong mục tiếp theo, cài đặt một DataSet cĩ khả năng lưu trữ
một phone book mẫu. DataSet lưu trữ một DataTable đơn, bảng này được thiết lập với hai DataColumn, một để lưu tên và một lưu sốđiện thoại. Đoạn mã sau mơ tả năm bước cần thiết để thêm dữ liệu cho một DataSet, bao gồm cả việc tạo một bảng mới.
Đoạn code: Tạo và lưu một DataSet
C#
DataSet l_DataSet = new DataSet();
// Create a DataTable that holds a "Name" and a "PhoneNumber" DataTable l_newTable = new DataTable("Phone Contacts"); l_newTable.Columns.Add(new DataColumn("Name", typeof(System.String)));
l_newTable.Columns.Add(new DataColumn("PhoneNumber", typeof(System.String)));
// Add the DataTable to the DataSet's table collection l_DataSet.Tables.Add(l_newTable);
// Now put a few names in... // GEORGE WASHINGTON
DataRow l_newRow = l_DataSet.Tables[0].NewRow(); l_newRow[0] = "George Washington";
l_newRow[1] = "555 340-1776";
l_DataSet.Tables[0].Rows.Add(l_newRow);
// BEN FRANKLIN
l_newRow = l_DataSet.Tables[0].NewRow(); l_newRow["Name"] = "Ben Franklin";
l_newRow["PhoneNumber"] = "555 336-3211";
l_DataSet.Tables[0].Rows.Add(l_newRow);
// Commit the changes l_DataSet.AcceptChanges();
3.2.4. Trích dữ liệu từ một DataSet
Trích dữ liệu từ một DataSet đơn giản như việc truy nhập vào DataTable trong tập hợp DataSet.Tables và xem xét các hàng mong muốn trong bảng. Mỗi hàng cĩ một chỉ số
làm cho nĩ dễ dàng truy nhập vào các cột mong muốn. Chỉ sốđầu tiên là số 0, như trong ví dụ:
- l_DataSet.Tables[0].Rows[0][0]: truy cập vào cột đầu tiên trong dịng đầu tiên của DataTable đầu tiên.
- l_DataSet.Tables[0].Rows[0][9]L: Truy cập vào cột thứ 10 trong hàng đầu tiên của DataTable đầu tiên.
- l_DataSet.Tables[0].Rows[29][9]: Truy cập vào cột thứ 10 trong hàng thư 30 của DataTable đầu tiên.
3.2.5. Trích dữ liệu của PhoneBook từ một DataSet
Đoạn code mẫu sau đây được đưa ra từ ứng dụng PhoneBook mẫu. Nĩ là một vịng lặp đi qua tất cả các hàng trong DataTable đầu tiên trong một DataSet và đưa các giá trị DataColumn thứ 0 và thứ 1 vào trong một ListBox.
C#
for (int i = 0; i < phonebookEntriesDataSet.Tables[0].Rows.Count; i++) {
this.listBox1.Items.Add(
phonebookEntriesDataSet.Tables[0].Rows[i][0] + " " + phonebookEntriesDataSet.Tables[0].Rows[i][1]); }
3.2.6. Thay đổi dữ liệu trong một DataSet
Để thay đổi dữ liệu được lưu trữ bên trong DataSet, bạn truy cập vào DataColumn mà bạn muốn thay đổi và đặt cho nĩ một giá trị mới. khi tất cả các thay đổi được kết thúc, bạn gọi hàm AcceptChanges để chấp nhận sự thay đổi đĩ.
Ví dụ, đoạn mã sau đây sẽ thiết đặt cột thứ hai trong hàng đầu tiên của bảng đầu tiên trong tập hợp DataSet thành một số ngẫu nhiên được cung cấp bởi l_randomGenerator.
C#
// Column 1 is the phone number. // |
// V
m_phonebookDS.Tables[0].Rows[0][1] = randomGenerator.Next().ToString();
Thay đổi bằng cách sử dụng chỉ số tên, cách này chậm hơn trong .NET Compact Framework khi lượng lớn dữ liệu là phức tạp:
C#
m_phonebookDS.Tables["Phone Contacts"].Rows[0]["PhoneNumber"] = l_randomGenerator.Next().ToString();
3.2.7. Gỡ những lỗi thơng thường cĩ liên quan đến DataSet
Lỗi chung nhất mà người dùng hay gặp phải khi họ cố gắng truy nhập hoặc thay
đổi một đối tượng trong một DataSet, như là một DataColumn hoặc DataRow mà nĩ khơng tồn tại. Ví dụ như, nếu một DataSet chỉ cĩ hai bảng thì đoạn code này cĩ thể bị lỗi bởi vì tập hợp DataSet.Tables sử dụng chỉ số 0:
C#
m_phonebookDS.Tables[2].Rows[0][1] = l_randomGenerator.Next().ToString();
Trong tình hình này thì một ngoại lệ chung nhất mà người phát triển sẽ thấy là IndexOutOfRangeException.