Danh mục tài liệu

Truy cập cơ sở dữ liệu với .NET - Làm việc với ADO.NET Phần cuối

Số trang: 13      Loại file: pdf      Dung lượng: 136.59 KB      Lượt xem: 10      Lượt tải: 0    
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Phần 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 cơ sở dữ liệu với ADO.NET. Phân tầng các ứng dụng Việc sản xuất các phần mềm tương tác với dữ liệu thường chia ứng dụng thành nhiều tầng. Một mô hình phổ biến của một ứng dụng phân tầng là các dịch 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 khó của mô hình này là việc phân tách dữ liệu giữa các tầng, và định dạng...
Nội dung trích xuất từ tài liệu:
Truy cập cơ sở dữ liệu với .NET - Làm việc với ADO.NET Phần cuối Truy cập cơ sở dữ liệu với .NET Làm việc với ADO.NETPhần 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ểncác ứng dụng truy cập cơ sở dữ liệu với ADO.NET.Phân tầng các ứng dụngViệc sản xuất các phần mềm tương tác với dữ liệu thường chia ứng dụngthành nhiều tầng. Một mô hình phổ biến của một ứng dụng phân tầng là cácdịch 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 khó của mô hình này là việc phân tách dữ liệu giữa cáctầng, và định dạng truyền giữa các tầng. ADO.NET đã giải quyết các vấn đềnày và đã sớm hỗ trợ cho kiểu cấu trúc này.Sao chép và trộn dữ liệuThật khó để copy một DB recordset? Trong In .NET thậy dễ dàng để saochép một DataSet:DataSet source = {some dataset};DataSet dest = source.Copy();Nó tạo một bản copy của DataSet nguồn – từng DataTable, DataColumn,DataRow, và Relation sẽ được sao chép y chan, và tất cả dữ liệu với cáctrạng thái trong file nguồn đều đươc sao chép. Nếu như bạn chỉ muốn saochép sơ đồ của DataSet, bạn có thể làm như sau:DataSet source = {some dataset};DataSet dest = source.Clone();Nó chỉ sao chép tất cả các table, relation, vân vâ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 tầng, dựa trên Win32 hoặcweb, là có truyền dữ liệu giữa các lớp càng ít càng tốt.DataSet có phương thưc GetChanges() để giải quyết các yêu cầu 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ộtDataSet với những dòng được cập nhật trong dataset nguồn. Đây là ý tưởngtruyền dữ liệu giữa các tầng, chỉ một tập nhở dữ 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 vỏ bọc là rất nhiều thứ hấp dẫn. Có hai quá tải của phươngthức GetChanges(). Một quá tải lấy giá trị của một DataRowState, và chỉ trảvề các trạng thái tương ứng. đơn giản gọi GetChanges()GetChanges(Deleted | Modified | Added), và kiểm tra nếu để bảo đảm rằngcó một vài thay đổi bằng cách gọi HasChanges(). Nếu không có thay đổinào, một giá trị được trả về ngay lập tức.Tiếp theo là sao chép DataSet. Trước tiên, một DataSet mới bỏ qua các ràngbuộc (EnforceConstraints = false), sau đó mỗi dòng đã thay đổi được saoché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 có thể truyềndữ liệu này qua các tầng để sử lí. Khi dữ liệu được cập nhật vào cơ sở dữliệu, changes DataSet có thể trả về cho trình gọi (trong ví dụ này, một vàitham số xuât từ các stored procedure đã cập nhật trong các cột). Những thayđổi này có thể trộn vào bộ DataSet bằng 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 ServerStored procedure RegionInsert trong ví dụ ở phần trước đã từng tạo ra mộtgiá trí khóa chính để chèn vào cơ sở dữ liệu. Phương thức tạo khoá đó cònthô sơ và không 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 có thể là định nghĩa một định dạng cột đơn giản, và trả về giá trị@@IDENTITY từ một stored procedure. Stored procedure dưới đây sửdụng bảng Categories trong cơ sở dữ liệu Northwind. Gõ stored procedurenày vào SQL Query Analyzer, hoặc chạy the file StoredProcs.sql trong thưmục 13_SQLServerKeys:CREATE PROCEDURE CategoryInsert(@CategoryNameNVARCHAR(15), @Description NTEXT, @CategoryID INTEGER OUTPUT) AS SET NOCOUNT OFF INSERT INTO Categories (CategoryName, Description) VALUES(@CategoryName, @Description) SELECT @CategoryID = @@IDENTITYGONó chèn một dòng mới vào bảng Category, và trả về khóa chính cho trìnhgọi. Bạn có thể kiểm tra procedure này bằng cách gõ dòng SQL sau vàoQuery Analyzer:DECLARE @CatID int;EXECUTE CategoryInsert Pasties , Heaven Sent Food , @CatIDOUTPUT;PRINT @CatID;Khi thực thi một bó lệnh, nó sẽ chèn mọt dòng mới vào bảng Categories, vàtrả về nhận dạng của dòng mới này, sau đó biểu diễn cho người dùng.Giả sử rằng sau một vài tháng sử dụng, một ai đó muốn có một sổ theo dõiđơn giản, để báo cáo những cập nhật và sửa đổi trên category name. Bạn sẽđịnh nghĩa một bảng như sau, để chỉ ra các giá trị mới và cũ của category:Mã sẵn có trong StoredProcs.sql. Cột AuditID được định nghĩa như một cộtIDENTITY. Sau đó bạn cấu trúc mọt cặp trigger để báo cáo các thay đổi trêntrường CategoryName:CREATE TRIGGER CategoryInsertTrigger ON Categories AFTER UPDATEAS INSERT INTO CategoryAudit(CategoryID , OldName , NewName ) SELECT old.CategoryID, old.CategoryName, new.CategoryName FROM Deleted AS old, Categories AS new WHERE old.CategoryID = new.CategoryID;GOBạn phải dùng Oracle stor ...