Các giá trị của <kiểu biểu thức> :
- SchemaType.Mapped : Sử dụng các TableMappings cho các cấu trúc đưa vào DataSet nếu trùng hợp.
- SchemaType.Source : Không sử dụng các TableMappings.
Thông thường SchemaType.Mapped được sử dụng nếu bảng đã có cấu trúc sẵn, các cột có tên khác với cột có sẵn trên bảng sẽ được thêm vào.
Tùy theo cấu trúc trên nguồn dữ liệu, những thuộc tính sau sẽ được đưa vào cấu trúc của cột :
• AllowDBNull : cho phép nhận giá trị Null hay không.
• AutoIncrement : tự động tăng.
• MaxLength : kích thước tối đa của cột (tính theo Byte).
• ReadOnly : chỉ cho phép đọc.
• Unique : cột có trị duy nhất.
Phương thức FillSchema cũng định luôn khóa chính và các ràng buộc cho bảng theo nguyên tắc sau :
• Các cột khóa chính trong lệnh truy vấn của SelectCommand được dùng làm các cột khóa chính cho bảng.
• Nếu không có cột khóa chính trong lệnh truy vấn, nhưng có những cột có trị duy nhất và nếu những cột này không cho phép nhận giá trị Null thì được dùng làm khóa chính. Ngược lại, mỗi một cột tuy có trị duy nhất nhưng chấp nhận giá trị Null thì một ràng buộc duy nhất được thêm vào tập hợp Constraints của bảng nhưng không có khóa chính.
Chỉ có các ràng buộc khóa chính và khóa duy nhất mới thêm vào tập hợp Constraints, các loại ràng buộc khác không được đưa vào.
Những đặc điểm của phương thức FillSchema cũng giống như của Fill.
Ví dụ :

Với lệnh

bo_doc_ghi sẽ lấy cấu trúc về cho các bảng trong DataSet và đặt tên các bảng theo cách mặc nhiên : Table, Table1.
Với lệnh

bo_doc_ghi sẽ lấy cấu trúc về cho các bảng trong DataSet và đặt tên các bảng theo TableMappings đã tạo : Vattu, Nhacc.
♦ Tạo bộ lệnh cập nhật cho DataAdapter :
Để tự động phát sinh lệnh cập nhật cho các command còn lại của DataAdapter, chúng ta sử dụng CommandBuilder thuộc tên miền :

Cách thực hiện như sau :

Ví dụ :

Mỗi DataAdapter chỉ có thể kết hợp với một CommandBuilder. Đối tượng này dùng nội dung lệnh trong SelectCommand của DataAdapter để tạo nội dung lệnh cho các Command còn lại với các đặc điểm sau :
• CommandBuilder chỉ phát sinh nội dung lệnh cập nhật cho các DataAdapter có nội dung SelectCommand truy xuất đến chỉ một bảng nguồn.
• Nội dung trong SelectCommand phải có ít nhất một khóa chính hoặc một khóa duy nhất (Unique key) để DataAdapter phân biệt các dòng khi cập nhật. Nếu không, CommandBuilder sẽ không phát sinh được nội dung lệnh cho các Command Insert, Update, Delete.
• Trường hợp nội dung của SelectCommand là truy vấn từ hơn một bảng hoặc từ một StoredProcedure, các Command cập nhật không tự động phát sinh, nhưng chúng ta phải khai báo các command cập nhật cách tường minh.
• Sau khi lệnh được phát sinh, nếu nội dung lệnh của SelectCommand thay đổi, lệnh của các Command khác không tự động thay đổi theo cho đến khi phương thức RefreshSchema của CommandBuilder được gọi.
• Trường hợp nội dung của SelectCommand là nhiều câu Select SQL, CommandBuilder chỉ tạo được lệnh cập nhật cho lệnh truy vấn đầu tiên.
Ví dụ : Cách thức CommandBuilder phát sinh lệnh cho các Command :

Khi DataAdapter phát sinh các Command cập nhật, nội dung của các Commandtext của DataAdapter sẽ như sau :

Khi cập nhật tùy giá trị trên mỗi dòng, các tham số @p1, @p2, … sẽ được tự động thay thế tương ứng.
Nội dung lệnh phát sinh của CommandBuilder còn tùy thuộc vào giá trị của thuộc tính ConflictOption nhằm giải quyết vấn đề tranh chấp dữ liệu trong môi trường nhiều người dùng cùng cập nhật.
Còn tiếp
Về đầu trang