Truy cập sở dữ liệu với .NET
m việc với ADO.NET
Phn cuối cùng này s cố gắng đưa ra nhưng kịch bản phổ biến khi phát triển
các ứng dụng truy cập sở dữ liệu với ADO.NET.
Phân tng các ứng dụng
Việc sản xuất c phần mềm tương tác với dữ liệu thường chia ng dụng
thành nhiu tầng. Một hình phbiến của một ng dụng phân tầng là c
dch vụ dữ liệu phân tầng, và một cơ sở dữ liệu phân tầng.
Một trong những cái kcủa mô hình này việc phân tách dliệu giữa các
tầng, và định dạng truyền giữa các tng. ADO.NET đã gii quyết các vấn đề
này và đã sm hỗ trợ cho kiểu cấu trúc này.
Sao chép và trộn dữ liệu
Thật kđể copy một DB recordset? Trong In .NET thậy dễ ng để sao
chép một DataSet:
DataSet source = {some dataset};
DataSet dest = source.Copy();
tạo một bản copy của DataSet nguồn từng DataTable, DataColumn,
DataRow, Relation s được sao chép y chan, và tất c dữ liệu với các
trạng thái trong file nguồn đều đươc sao chép. Nếu như bạn chỉ muốn sao
chép sơ đồ của DataSet, bn có thể làm như sau:
DataSet source = {some dataset};
DataSet dest = source.Clone();
chsao chép tất cc table, relation, vân n. Tất nhiên, DataTable s
rỗng.
Một thực tế phổ biến khi viết các hệ thống phân tng, dựa trên Win32 hoặc
web, là có truyn dữ liệu giữa các lớp càng ít càng tốt.
DataSet phương thưc GetChanges() để giải quyết c yêu cu này.
Phương thức đơn giản này thực thi một loạt các công việc và tr về một
DataSet với những dòng được cập nhật trong dataset nguồn. Đây là ý tưởng
truyền dữ liệu giữa các tầng, chỉ mt tập nhdữ liệu được truyền.
Ví dụ sau chỉ ra cách tạo một "changes" DataSet:
DataSet source = {some dataset};
DataSet dest = source.GetChanges();
Bên dưới lớp vbọc là rất nhiều thứ hấp dẫn. hai quá tải của phương
thức GetChanges(). Một qtải lấy giá trị của một DataRowState, chtrả
v các trạng thái tương ứng. GetChanges() đơn giản gọi
GetChanges(Deleted | Modified | Added), kim tra nếu để bảo đảm rằng
một vài thay đi bằng cách gọi HasChanges(). Nếu không có thay đổi
nào, một giá trị được trả về ngay lập tức.
Tiếp theo sao chép DataSet. Trước tiên, một DataSet mới bqua các ràng
buộc (EnforceConstraints = false), sau đó mỗi dòng đã thay đổi được sao
chép vào một DataSet mới.
Như vậy bạn có một DataSet chỉ chứa các thay đổi, sau đó bạn thể truyền
dliệu này qua các tng để s. Khi dliệu được cập nhật vào sở dữ
liu, "changes" DataSet th trả về cho trình gi (trong dnày, một vài
tham sxuât từ các stored procedure đã cp nhật trong các cột). Nhng thay
đổi này thtrn vào bDataSet bng cách dùng phương thức Merge().
Tiến trình này được mô tả như sau:
Tạo khoá với SQL Server
Stored procedure RegionInsert trong dphần trước đã từng tạo ra một
giá trí khóa chính để chèn vào sdữ liệu. Phương thức tạo khoá đó còn
thô kng linh đng, vì vậy một ứng dụng thực tế cần dùng đến các kĩ
thật tạo khóa cao cấp hơn.
Đầu tiên thđịnh nghĩa một định dạng cột đơn giản, và trvề giá tr
@@IDENTITY t một stored procedure. Stored procedure dưới đây s
dụng bảng Categories trong sở dữ liệu Northwind. stored procedure
này vào SQL Query Analyzer, hoặc chạy the file StoredProcs.sql trong t
mục 13_SQLServerKeys:
CREATE PROCEDURE CategoryInsert(@CategoryName
NVARCHAR(15),
@Description NTEXT,
@CategoryID INTEGER OUTPUT) AS
SET NOCOUNT OFF
INSERT INTO Categories (CategoryName, Description)
VALUES(@CategoryName, @Description)
SELECT @CategoryID = @@IDENTITY
GO
chèn một dòng mới vào bng Category, trvề khóa chính cho trình
gọi. Bạn thể kiểm tra procedure này bng cách gõ ng SQL sau o
Query Analyzer:
DECLARE @CatID int;
EXECUTE CategoryInsert 'Pasties' , 'Heaven Sent Food' , @CatID
OUTPUT;
PRINT @CatID;
Khi thực thi một lệnh, schèn mọt dòng mới vào bng Categories, và
trả về nhận dạng của dòng mi này, sau đó biểu diễn cho người dùng.
Gisrằng sau một vài tháng sdụng, một ai đó muốn một stheo dõi
đơn gin, để báo o những cập nhật sửa đổi trên category name. Bn s
định nghĩa một bảng như sau, để chỉ ra các giá trị mi và cũ của category:
sẵn trong StoredProcs.sql. Cột AuditID được định nghĩa như một ct
IDENTITY. Sau đó bn cấu trúc mọt cặp trigger để báo cáo các thay đổi trên
trường CategoryName:
CREATE TRIGGER CategoryInsertTrigger
ON Categories