Khi chúng ta đã tạo ra DataTable và DataSet (phần 1 & 2), chúng ta có thể muốn lưu dữ liệu đến một tập tin (XML hay nhị phân) nào đó và chúng ta cũng muốn đọc lại các dữ liệu từ các tập tin này khi cần. Quá trình ghi dữ liệu đến một tập tin (XML hay nhị phân) gọi là serializing và quá trình đọc dữ liệu từ tập tin gọi là deserializing. Trong phần 3 này, chúng ta sẽ tìm hiểu hai quá trình serializingdeserializing chỉ giới hạn với tập tin XML và đối tượng DataTable (với tập tin nhị phân và đối tượng DataSet có thể tìm hiểu chi tiết tại thư viện MSDN tại địa chỉ msdn.microsoft.com). Ngoài ra, trong phần 3 này chúng ta cũng sẽ tìm hiểu thêm về khái niệm data binding hay ràng buộc dữ liệu. Hình sau minh hoạ hai quá trình serializing và deserializing cho hai bảng Genre và Review (ví dụ ở phần 2)

Serializing

Chúng ta có thể lưu trữ một đối tượng DataTable đến một tập tin XML với phương thức WriteXML và tham số XmlWriteMode (kiểu liệt kê) quy định cách chúng ta lưu một DataTable (hay DataSet) đến tập tin XML theo 3 cách (là các thành viên):

Thành viên Chức năng
DiffGram Lưu toàn bộ DataTable (hay DataSet) như một DiffGram, bao gồm toàn bộ các giá trị phiên bản gốc (original) và hiện tại (current).
IgnoreSchema Lưu nội dung là dữ liệu của DataTable (hay DataSet) và không lưu lược đồ (schema).
WriteSchema Lưu nội dung gồm dữ liệu và lược đồ của DataTable (hay DataSet).

 

Đoạn mã sau minh hoạ lưu dữ liệu từ bảng Genre (bao gồm cả lược đồ) đến một tập tin XML tên Gen.XML trong ổ đĩa I:\:

Mã VB


gen.WriteXml(XMLName("Gen.xml"), XmlWriteMode.WriteSchema)

Private Function XMLName(ByVal fileName As String) As String

  ' tạo một tập tin trên ổ đĩa cục bộ I:

  Return Path.Combine("I:\\", fileName)

End Function

Mã C#


gen.WriteXml(XMLName("Gen.xml"), XmlWriteMode.WriteSchema);

private string XMLName(string fileName)

{

  // tạo một tập tin trên ổ đĩa cục bộ I:

  return Path.Combine("I:\\\\", fileName);

}

Khi thực hiện thành công, nội dung tập tin Gen.xml có thể trông như sau:


<?xml version="1.0" standalone="yes"?>

  <myDataSet>

    <xs:schema id="myDataSet" xmlns="" 

            xmlns:xs="http://www.w3.org/2001/XMLSchema" 

            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

    <xs:element name="myDataSet" msdata:IsDataSet="true" 

         msdata:MainDataTable="Genre" 

         msdata:UseCurrentLocale="true">

         <xs:complexType>

           <xs:choice minOccurs="0" maxOccurs="unbounded">

             <xs:element name="Genre">

                <xs:complexType>

                   <xs:sequence>

                       <xs:element name="Id" type="xs:string" />

                       <xs:element name="Name" type="xs:string" minOccurs="0" />

                   </xs:sequence>

                 </xs:complexType>

             </xs:element>

           </xs:choice>

      </xs:complexType>

      <xs:unique name="Constraint1" msdata:PrimaryKey="true">

        <xs:selector xpath=".//Genre" />

        <xs:field xpath="Id" />

      </xs:unique>

   </xs:element>

  </xs:schema>

  <Genre>

    <Id>01</Id>

    <Name>Pop</Name>

  </Genre>

</myDataSet>

Deserializing

Chúng ta có thể đọc nội dung từ một tập tin XML vào DataTable (hay DataSet) với phương thức ReadXML. Phương thức ReadXML cũng chứa tham số kiểu liệt kê XmlReadMode quy định cách đọc dữ liệu từ tập tin XML đến DataTable. Các thành viên của XmlReadMode gồm:

Thành viên Chức năng
Auto Mặc định (hay vắng mặt trong phương thức).
DiffGram Đọc một DiffGram, cập nhật các thay đổi từ DiffGram đến DataTable (hay DataSet).
Fragment Đọc tập tin XML như một đoạn hay mảnh (fragment). Đoạn hay mảnh XML có thể chứa nhiều phần tử gốc.
IgnoreSchema Đọc tập tin XML bỏ qua lược đồ.
InferSchema Đọc tập tin XML và tạo lược đồ dựa vào dữ liệu. Kiểu dữ liệu của tất cả các cột được xem như kiểu string.
InferTypedSchema Đọc tập tin XML và tạo lược đồ dựa vào dữ liệu. Kiểu dữ liệu được tạo phù hợp với các cột, nếu không xác định được xem như kiểu string.
ReadSchema Đọc tập tin XML và tìm kiếm lược đồ được nhúng bên trong.

 

Đoạn mã sau minh hoạ cách đọc nội dung từ tập tin Gen.xml vào bảng Genre như sau:

Mã VB


gen.ReadXml(XMLName("Gen.xml"))

Mã C#


gen.ReadXml(XMLName("Gen.xml"));

Các kiểu đặc biệt

Lớp DataTable cho phép có một cột có kiểu đặc biệt như dữ liệu XML hay một thể hiện (instance) của một đối tượng nào đó. Kiểu dữ liệu đặc biệt này còn gọi là kiểu tham chiếu (reference type).

Ràng buộc dữ liệu (data binding)

Ứng dụng Windows Form

Để ràng buộc dữ liệu đến các điều khiển (controls) trong ứng dụng Windows Form, chúng ta phải thiết lập ít nhất là thuộc tính DataSource của điều khiển đến một đối tượng để thực thi giao diện IList. Ngoài ra còn có một vài thuộc tính khác tuỳ theo điều khiển mà chúng ta cần ràng buộc dữ liệu. Một số thuộc tính quan trọng:

  • DataSource: là thuộc tính khi ràng buộc dữ liệu. Bạn có thể gán bất cứ thứ gì như mảng (arrays), danh sách (lists) để thực thi giao diện IList, các data tables hay data sets để thực thi giao diện IListSource,…
  • DataMember: được dùng khi trong nguồn dữ liệu xác định bởi DataSource chứa nhiều tập dữ liệu (ví dụ nhiều bảng), lúc đó chúng ta cần chỉ ra tập dữ liệu nào được dùng với DataMember.
  • DisplayMember: được dùng cho các điều khiển dạng danh sách như ComboBox hay ListBox, để xác định cột của bảng dữ liệu hay thuộc tính của các mục trong một collection cần hiển thị.
  • ValueMember: được dùng cho các điều khiển dạng danh sách như ComboBox hay ListBox, để xác định cột có thể được nhận khi một lựa chọn xảy ra.

Ứng dụng Web Form ASP.NET

Để ràng buộc dữ liệu đến các điều khiển (controls) trong ứng dụng Web Form ASP.NET, chúng ta phải thiết lập ít nhất là thuộc tính DataSource của điều khiển đến một đối tượng để thực thi giao diện IList. Ngoài ra còn có một vài thuộc tính khác tuỳ theo điều khiển mà chúng ta cần ràng buộc dữ liệu. Một số thuộc tính quan trọng:

  • DataSource: là thuộc tính khi ràng buộc dữ liệu. Bạn có thể gán bất cứ thứ gì như mảng, danh sách, hay data tables để thực thi giao diện IEnumerable.
  • DataMember: được dùng khi trong nguồn dữ liệu xác định bởi DataSource chứa nhiều tập dữ liệu (ví dụ nhiều bảng), lúc đó chúng ta cần chỉ ra tập dữ liệu nào được dùng với DataMember.
  • DisplayMember: được dùng cho các điều khiển dạng danh sách như DropDownList hay ListBox, để xác định cột của bảng dữ liệu hay thuộc tính của các mục trong một collection cần hiển thị.
  • ValueMember: được dùng cho các điều khiển dạng danh sách như DropDownList hay ListBox, để xác định cột có thể được nhận khi một lựa chọn xảy ra.

Các điều khiển trong ASP.NET yêu cầu bạn thực thi phương thức DataBind để xác định dữ liệu sẵn sàng được chuyển sang mã client (render). Khi một điều khiển được yêu cầu thực hiện phương thức DataBind thì tất cả các điều khiển con của nó sẽ tự động thực thi phương thức DataBind.

Ứng dụng WPF (Windows Presentation Foundation)

Kết buộc dữ liệu nguồn đến đích nhờ các thuộc tính như DependencyProperty hay ItemSource.