Chương 4 ADO.NET trên .NET CompactFramework
4.5 Mơ hình dữ liệu quan hệ với DataSet
Chúng ta hãy tìm hiểu DataSet lưu trữ DataTable, truy nhập dữ liệu, và yêu cầu theo
mẫu ràng buộc trên dữ liệu. Trong phần này chúng ta xây dựng kiến thức và học các thao tác nền tảng chung nhất về CSDL quan hệ cùng với dữ liệu bên trong DataSet.
Xuất phát từ giá trị DataColumn cùng với biểu thức và trường tính tốn
Giá trị của DataColumn có thể được tính tốn dựa trên giá trị của DataColumn khác trong cùng một DataRow. Để làm điều này, sử dụng thuộc tính DataColumn.Expression để mơ tả giá trị tính tốn của DataColumn. Thuộc tính Expression là một giá trị chuỗi được mơ tả sự tính tốn xuất phát từ giá trị cho DataColumn.
Cú pháp biểu thức rất nhiều và hỗ trợ rất nhiều phép tính tốn học và chuỗi. Bảng 4.1 đưa đến tất cả các phép toán được .NET Compact Framework hỗ trợ.
Bảng 4.1. Các phép tốn Framework hỗ trợ để tính tốn
Bảng 4.1. Các phép tốn Framework hỗ trợ để tính tốn
Phép tốn Chức năng
Sum Tính tổng các đối số
Avg Tính trung bình các đối số
Min Lựa chọn giá trị nhỏ nhất của các đối số
Max Lựa chọn giá trị nhỏ lớn của các đối số
+, -, *, / Cộng, trừ, nhân, chia
% Phép chia lấy phần dư
+ Ghép chuỗi
Ví dụ:
l_newTable.Columns["FullName"].Expression = "FirstName + ' ' + LastName";
l_newTable.Columns["TotalPrice"].Expression = "MSRP - Discount"; l_newTable.Columns["FinalGrade"].Expression = "Avg(Exam1, Exam2, Exam3)";
Biểu thức quan hệ cha con trong DataSet
Thực chất thành phần của CSDL quan hệ là các bảng với các dịng có khả năng tạo quan hệ cha con, hoặc một quan hệ, giữa hai bảng. Một quan hệ giưa hai bảng được tạo bằng liên kết giưa hai bảng bằng một hoặc nhiều cột dữ liệu gọi là khóa chính. Trong bảng cha, khóa chính xác định mỗi dịng là duy nhất trong bảng. Các dịng trong bảng con có một trường gọi là khóa ngoại, trường này khơng phải là duy nhất trong bảng con.
Ví dụ bảng cha MainContactTable, và bảng con CholesterolTable. Bảng 4.2. MainContactTable
Tên trường Kiểu dữ liệu
CustID Integer, Khóa chính
FirstName String
LastName String
Bảng 4.3. CholesterolTable
Tên trường Kiểu dữ liệu
CustID Integer, Khóa chính Reading1 Decimal
Reading2 Decimal Reading3 Decimal Average Decimal
Trong bảng CholesterolTable, CustID tham chiếu đến một bản ghi duy nhất trong bảng MainContactTable. Bảng 4.4 và 4.5 cho thấy quan hệ cha con khi lưu trữ.
Bảng 4.4. MainContactTable
CustID FirstName LastName
001 George Washington
002 Ben Franklin
003 Alexander Hamilton
Bảng 4.5. CholesterolTable
CustID Reading1 Reading2 Reading3 Average
001 87 78 66 77.0
001 99 54 89 80.667
002 90 88 55 77.667
Trong ví dụ bảng cha con ví dụ trên, bản ghi trong bảng CholesterolTable tương ứng với George Washington và một bản ghi tương ứng với Ben Franklin. Vấn đề gì sẽ xây ra nếu bản ghi George Washington bị xóa trong bảng MainContactTable? Hệ thống sẽ bị xóa tất cả bản ghi tương ứng trong bảng CholesterolTable, hoặc CSDL sẽ ở trạng thái lỗi.
.NET Compact Framework cung cấp hai lớp có thể làm việc đó tự động: DataRelation và ForeignKeyConstraint.
Tạo một DataRelation để thể hiện quan hệ cha con
Khi thiết lập một DataRelation giữa hai bảng, chúng ta chỉ rõ DataColumn như là khóa chính và khóa ngoại. Sau khi DataRelation được tạo, nó sẽ đảm bảo rằng dữ liệu quan hệ của
DataSet như là được mô tả bởi DataRelation. Ví dụ, nếu chúng ta xóa bản ghi đầu tiên trong
bảng MainContactTable, DataRelation sẽ tự động xóa tất cả các dịng con trong bảng
CholesterolTable.
Để thiết lập DataRelation giữa hai bảng trong một DataSet, trước tiên tạo DataRelation bằng cách sử dụng hàm khởi tạo thơng qua DataColumns bao gồm khóa chính và
khóa ngoại. Các hàm khởi tạo .NET Compact Framework như sau:
• DataRelation(String relName, DataColumn parent, DataColumn child)
Tạo một DataRelation giữa DataColumns cha và con.
• DataRelation(String relName, DataColumn[] parent, DataColumn[] child) Tạo DataRelation giữa hai bảng sử dụng nhiều trường cho mỗi bảng đê quan hệ.
• DataRelation(String relName, DataColumn parent, DataColumn child,
bool createConstraints) Tạo một DataRelation giữa DataColumns cha và con.
• DataRelation(string relName, DataColumn[] parent, DataColumn[]
child, bool createConstraints) Tạo DataRelation giữa hai bảng bằng cách sử dụng nhiều
• DataRelation(string relName, string parentTableName, string
childTableName, string[] parentColNames, string[] childColNames, bool isNested) là một khởi tạo đã sử dụng môi trường Smart Device Extensions.
Viết mã lệnh để tạo DataRelation
DataRelation l_newRelation = new DataRelation( "MainContactToCholesterolRelation",
l_DataSet.Tables["PhoneContactsMainTable"].Columns["ContactID"], l_DataSet.Tables["Cholesterol"].Columns["ContactID"]);
l_DataSet.Relations.Add(l_newRelation);