Thứ Hai, 5 tháng 8, 2013

Tạo một DataSet (Lập trình CSDL với C#)

Trước tiênn bạn đã định nghĩa sơ đồ của bộ dữ liệu của bạn, với đầy đủ các DataTable, DataColumn, Constraint, và những gì cần thiết, bạn nên tạo DataSet v̕i một vài thông tin bổ sung. Có hai cách chính để đọc dữ liệu từ một nguồn bên ngoài và chèn nó vào DataSet:

  • Dùng trình cung cấp dữ liệu
  • Đọc XML vào trong DataSet

Tạo một DataSet dùng một DataAdapter

Đoạn mã về dòng dữ liệu được giới thiệu trong lớp SqlDataAdapter, được trình bày như sau:
string select = "SELECT ContactName,CompanyName FROM Customers";
SqlConnection conn = new SqlConnection(source);
SqlDataAdapter da = new SqlDataAdapter(select , conn);
DataSet ds = new DataSet();
da.Fill(ds , "Customers");
Hai dòng in đậm chỉ ra cách dùng của SqlDataAdapterOleDbDataAdapter cũng có nhưng tính năng ảo giống như Sql equivalent.
SqlDataAdapterOleDbDataAdapter là hai lớp xuất phát từ một lớp cơ bản chứ không phải là một bộ các giao diện, và nhất là các lớp SqlClient- hoặc OleDb. Cây kế thưa được biểu diễn như sau:
System.Data.Common.DataAdapter
   System.Data.Common.DbDataAdapter
      System.Data.OleDb.OleDbDataAdapter
      System.Data.SqlClient.SqlDataAdapter
Trong quá trình lấy dữ liệu từ một DataSet, cần phải có một vài lệnh được dùng để chọn dữ liệu. Nó có thể là một câu lệnh SELECT, một stored procedure, hoặc OLE DB provider, một TableDirect command. Ví dụ trên sử dụng một trong những cấu trúc sẵn có trong SqlDataAdapter để truyền câu lệnh SELECT vào một SqlCommand, và phát nó khi gọi phương thức Fill() trên adapter.
Trở lại với các ví dụ về stored procedures trong chương trước, Tôi đã định nghĩa các stored procedure INSERT, UPDATE, và DELETE, nhưng chưa đưa ra một procedure để SELECT dữ liệu. Chúng ta sẽ lấp lỗ hổng này trong phần sau, và chỉ ra cách làm sao để gọi một stored procedure từ một SqlDataAdapter để tạo dữ liệu cho một DataSet.

Sử dụng một Stored Procedure trong một DataAdapter

Trước tiên chúng ta cần định nghĩa một stored procedure và cài nó vào cơ sở dữ liệu database. Mã cho ví dụ này sẵn có trong thư mục 11_DataAdapter. Stored procedure đẻ SELECT dữ liệu như sau:
CREATE PROCEDURE RegionSelect AS
  SET NOCOUNT OFF
  SELECT * FROM Region
GO
Ví dụ này tương đối đơn giản nó thật không xứng tầm với một stored procedure, chỉ là một câu lệnh SQL đơn giản. Stored procedure này có thể đánh vào SQL Server Query Analyzer, hoặc bạn có thể chạy file StoredProc.sql để sử dụng ví dụ này.
Tiếp theo, chúng ta cần định nghĩa một SqlCommand để thực thi stored procedure này. Một lần nữa mã rất đơn giản, và hầu hết đã được đưa ra trong các phần trên:
private static SqlCommand GenerateSelectCommand(SqlConnection conn )
{
   SqlCommand  aCommand = new SqlCommand("RegionSelect" , conn);
   aCommand.CommandType = CommandType.StoredProcedure;
   aCommand.UpdatedRowSource = UpdateRowSource.None;
   return aCommand;
}
Phương thức này phát ra SqlCommand để gọi thủ tục RegionSelect khi thực thi. Và cuối cùng là móc nói nó với một SqlDataAdapter thông qua lời gọi phương thức Fill():
DataSet ds = new DataSet();
// Create a data adapter to fill the DataSet
SqlDataAdapter da = new SqlDataAdapter();
// Set the data adapter's select command
da.SelectCommand = GenerateSelectCommand (conn);
da.Fill(ds , "Region");
Ở đây tôi tạo một SqlDataAdapter mới, xem SqlCommand được phát ra thông qua thuộc tính SelectCommand của data adapter, và gọi Fill(), để thực thi stored procedure và chèn tất cả các dòng vào the Region DataTable.

Tạo một DataSet từ XML

Ngoài việc tạo sơ đồ cho mọt DataSet và các bảng tương ứng, một DataSet có thể đọc và ghi các dữ liệu bẩm sinh XML, giống như một file trên đĩa, một stream, hoặc một text reader.
Để load XML vào một DataSet, đơn giản gọi một trong những phương thức ReadXML(), chẳng hạn như mã sau, dùng để đọc từ một file trên đĩa:
DataSet ds = new DataSet();
ds.ReadXml(".\\MyData.xml");