Mơ hình dữ liệu quan hệ với DataSet 69

Một phần của tài liệu Tìm hiểu về công nghệ NET compact framework và lập trình ứng dụng trên pocket PC (Trang 69 - 74)

Bây giờ bạn sẽ tìm hiểu đầy đủ về việc DataSet lưu trữ một DataTable, truy nhập dữ liệu, và giám sát việc thi hành một số mẫu của những ràng buộc dữ liệu. Trong mục này chúng ta xây dựng dựa vào kiến thức đã biết và học thực hiện những thao tác về cơ sở dữ liệu quan hệ chung với dữ liệu được lưu trũ trong DataSet.

3.5.1 Xuất phát từ những giá trị DataColumn cùng với biểu thức và các trường tính tốn.

Những giá trị của một DataColumn có thể được tính tốn dựa trên giá trị DataColumn khác trong cùng DataRow. Để làm điều này, ta 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ị kiểu string, nó mơ tả việc tính tốn xuất phát từ giá trị của DataColumn.

Cú pháp của biểu thức rất nhiều và được hỗ trợ một tập hợp rất phong phú về các phép tính tốn học và chuỗi. Bảng 6.1 trình bày tất cả các tốn tử của biểu thức mà được hỗ trợ bởi .NET Compact Framework.

Bảng 3.1. Những toán tử của biểu thức được hỗ trợ bởi Framework Toán Tử Chức Năng

Sum Tính tổng của 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ị lớn nhất của các đối số

+, -, *, / Các phép tính: cộng, trừ, nhân, chia

% Chia lấy số dư (phần còn lại của phép chia)

+ Ghép chuỗi

Ví dụ tạo biểu thức.

Cách dễ dàng nhất để hiểu “việc tạo một biểu thức như thế nào?” là xem một ví dụ. Cho ví dụ đẩu tiên của chúng ta hãy xem một DataTable được gọi là l_newTable mà nó có ba cột được đặt tên là: FirstName, LastName, và FullName. Mục đích của việc tạo một biểu thức mà đặt cột tên là FullName để ghép chuỗi của cột FirstName và cột LastName lại với nhau. Code sau đây sẽ trình bày việc làm này:

C#

Cho ví dụ thứ hai, ta sẽ xem một DataTable được đặt tên là l_newTable.Chúng tôi muốn đưa cột TotalPrice vào để lưu giá trị của cột MSRP trừ đi giá trị của cột Discount. C#

l_newTable.Columns["TotalPrice"].Expression = "MSRP - Discount";

ví dụ cuối cùng, l_newTable được xem là một DataTable với bốn cột: FinalGrade, Exam1, Exam2, và Exam3. Chúng tôi muốn đặt giá trị của cột FinalGrade bằng giá trị trung bình của Exam1, Exam2, và Exam3, như đoạn code sau:

C#

l_newTable.Columns["FinalGrade"].Expression = "Avg(Exam1, Exam2, Exam3)";

3.5.2 Biểu diễn mối quan hệ Cha – Con tring một DataSet

Thành phần chủ yếu của một CSDL quan hệ là các bảng với các hàng và khả năng tạo một mối quan hệ Cha – Con, hoặc một mối quan hệ giữa hai bảng với nhau. Một mối quan hệ giữa hai bảng được làm bằng cách liên kết hai bảng bởi một hoặc nhiều cột dữ liệu được làm khố chính. Trong bảng cha, khố chính (primary key) là duy nhất cho tất cả các hàng trong bảng. Các hàng trong bảng con có một cột gọi là khố ngoại (foreign key), nó khơng phải là duy nhất trong bảng con. Nó nhằm vào hàng tương ứng trong bảng cha.

Ví dụ, xem bảng 3.2, một bảng cha lưu thơng tin chính về ngươi bệnh cho một văn phịng của thầy thuốc.

Table 3.2. MainContactTable

COLUMN NAME DATA TYPE

CustID Integer, PRIMARY KEY

FirstName String

LastName String

Bảng 3.3: Một bảng con lưu ngiên cứu về cholesterol.

Table 3.3. CholesterolTable

COLUMN NAME DATA TYPE

CustID Integer, FOREIGN KEY

Reading1 Decimal

Reading2 Decimal

Table 3.3. CholesterolTable

COLUMN NAME DATA TYPE

Average Decimal

Trong bảng CholesterolTable thì cột CustID có là cột duy nhất tham chiếu tới bảng MainContactTable. Bảng 3.4 và 3.5 cho thấy mối quan hệ cha – con khi lưu trữ.

Table 3.4. MainContactTable

CustID FirstName LastName

001 George Washington

002 Ben Franklin

003 Alexander Hamilton

Table 3.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 bảng cha – con ở ví dụ này, có hai mục (bản ghi) trong bảng CholesterolTable cho George Washington và một mục cho Ben Franklin. Chuyện gì sẽ xảy ra nếu bản ghi của George Washington bị xoá trong bảng MainContactTable? Hệ thống phải xoá tất cả những bản ghi tương ứng trong CholesterolTable hoặc cơ sở dữ liệu sẽ bị hỏng.

3.5.3 Tạo một DataRelation cho việc biểu diễn quan hệ cha – con.

Khi bạn thiết đặt một DataRelation giữa hai bảng, bạn phải chỉ định rõ DataColumn như khóa chính, khố ngoại. Sau khi DataRelation được tạo, nó sẽ bảo đảm dữ liệu quan hệ của DataSet, như được mơ tả bởi DataRelation. Ví dụ, nếu bạn xố hàng đầu tiên từ bảng MainContactTable, thì DataRelation tự động xoá tất cả các hàng con trong CholesterolTable.

Để thiết lập một DataRelation giữa hai bảng trong một DataSet, thì đầu tiên tạo một DataRelation bằng cách sử dụng hàm tạo thông qua DataColumn mà bao gồm khố chính và khố ngoại. Các hàm tạo trong .NET Compact Framework như sau:

 DataRelation(String relName, DataColumn parent, DataColumn child): tạo một tên DataRelation giữa DataColumns cha và con.

 DataRelation(String relName, DataColumn[] parent, DataColumn[] child): tạo một tên DataRelation giữa hai bảng bằng cách sử dụng nhiều cột cho mỗi bảng của 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 một DataRelation giữa hai bảng bằng cách sử dụng nhiều cột cho mỗi bảng của quan hệ, với tùy chọn rõ ràng để tạo ra những ràng buộc kết hợp với việc thi hành quan hệ.

 DataRelation(string relName, string parentTableName, string childTableName, string[] parentColNames, string[] childColNames, bool isNested): Là hàm tạo đã sử dụng môi trường Smart Device Extensions.

Sau đó ta dễ dàng thêm DataRelation cho tập hợp DataSet.Relations.

3.5.4 Viết code để tạo một DataRelation

Đây là code mẫu được lấy từ code của ứng dụng PhoneBook, nó mơ tả việc sử dụng các lớp Expression và DataRelation. Code tạo một DataRelation mới mà nó nối kết cột ContactID từ bảng PhoneContactsMainTable và bảng Cholesterol bên trong DataSet. C#

DataRelation l_newRelation = new DataRelation( "MainContactToCholesterolRelation",

l_DataSet.Tables["PhoneContactsMainTable"].Columns["ContactID"], l_DataSet.Tables["Cholesterol"].Columns["ContactID"]);

l_DataSet.Relations.Add(l_newRelation);

3.5.5 Ràng buộc những quan hệ khoá ngoại bằng ForeignKeyConstraint

ForeignKeyConstraint rất giống DataRelation nhưng nó cung cấp thêm tính linh hoạt. Như với một UniqueConstraint, thì ForeignKeyConstraint được thêm vào cho một tập hợp DataTable.Constraints. Một cách cụ thể hơn, ForeignKeyConstraint được thêm vào cho tập hợp Constraints của bảng con.

Khi một hàng con bị xố từ một bảng cha thì ForeignKeyConstraint có thể gây ra những trường hợp sau:

 Nó có thể gây ra tất cả những hàng con sẽ bị xố. Việc làm đó cũng giống như sử dụng một DataRelation..

 Nó có thể đặt các giá trị cột con, khoá ngoại, giá trị NULL. Như vậy, chúng khơng cịn trỏ vào một hàng cha mà khơng tồn tại.

 Nó có thể đặt giá trị cột con một giá trị mặc định. Điều này là có ích.

 Nó có thể đưa ra ngoại lệ.

Để đặt một ForeignKeyConstraint, đầu tiên ta tạo một ForeignKeyConstraint thơng qua các hàm tạo sẵn có trong .NET Compact Framework. Các hàm tạo sẵn có trong .NET Compact Framework được liệt kê dưới đây:

 ForeignKeyConstraint(DataColumn parentCol, DataColumn childCol): tạo một ForeignKeyConstraint giữa DataColumns cha và con.

 ForeignKeyConstraint(String name, DataColumn parentCol, DataColumn ChildCol): tạo một ForeignKeyConstraint giữa bảng cha và bảng con, nhưng bắt buộc đưa ra một tên.

 ForeignKeyConstraint(DataColumn[] parentCols, DataColumn[]

childCols): tạo một ForeignKeyConstraint giữa hai bảng bằng cách sử dụng nhiều DataColumn cho ràng buộc.

 ForeignKeyConstraint(String name, DataColumn[] parentCols, DataColumn[] childCols): tạo một ForeignKeyConstraint giữa hai bảng bằng cách sử dụng nhiều DataColumns cho nhiều ràng buộc, nhưng mọi ràng buộc trở thành một tên.

 ForeignKeyConstraint(string cName, string pName, string[] pColNames, string[] cColNames, AcceptRejectRule arRule, Rule dRule, Rule uRule): được sử dụng trng môi trường Smart Device Extensions.

Tiếp theo đặt DeleteRule, UpdateRule, và AcceptRejectRule của ForeignKeyConstraint. UpdateRule kiểm tra điều gì xảy ra khi một hàng cha bị sửa đổi. AcceptRejectRule kiểm tra điều gì xảy ra khi một hàng cha bị sửa đổi và hàm DataSet.AcceptChanges() được gọi. UpdateRule và DeleteRule là kiểu Rule trong khi AcceptRejectRule là một kiểu AcceptRejectRule.

Ví dụ, ta xem xét một ForeignKeyConstraint mà được sử dụng để biểu diễn một mối quan hệ giữa hai bảng. Nếu như một hàng từ bảng cha bị xố, thì giá trị của Delete được kiểm tra xác định xem chuyện gì sẽ xảy ra với các bảng con:

- Rule.Cascade: xố theo tầng, vì vậy các hàng con cũng được xố. - Rule.SetDefault: giá trị của các hàng con được đặt là DBNull. - Rule.None: một ngoại lệ được đưa ra.

AcceptRejectRule được kiểm tra chỉ khi DataSet.AcceptChanges được gọi. kiểu AcceptRejectRule có hai giá trị: Cascade và None. Nếu AcceptRejectRule đặt giá trị là Cascade thì DataSet cố thay đổi tầng trong một hàng cha cho hàng con của nó khi

Bây giờ ForeignKeyConstraint được thiết đặt. Để sử dụng nó, ta thêm vào cho ForeignKeyConstraint tập hợp Constraints của bảng con.

Tạo một ForeignKeyConstraint với code mẫu.

Code mẫu dưới đây tạo một ForeignKeyConstraint mà xếp tầng khi một hàng cha bị xố. Điều đó có nghĩa là khi một hàng cha bị xố thì các hàng con cũng bị xoá. Ta xem code dưới đây :

C#

ForeignKeyConstraint l_ForeignKC = new

ForeignKeyConstraint("MainToCholesterolFKConstraint", l_DataSet.Tables["PhoneContactsMainTable"].Columns ["ContactID"], l_DataSet.Tables["BloodPressure"]. Columns["ContactID"]); l_ForeignKC.DeleteRule = Rule.Cascade; l_ForeignKC.UpdateRule = Rule.Cascade; l_ForeignKC.AcceptRejectRule = AcceptRejectRule.Cascade; l_DataSet.Tables["BloodPressure"].Constraints.Add(l_ForeignKC); l_DataSet.EnforceConstraints = true;

Một phần của tài liệu Tìm hiểu về công nghệ NET compact framework và lập trình ứng dụng trên pocket PC (Trang 69 - 74)