Cách dùng DataSet trong C# [ADO.NET]
Trong bài viết này chúng ta sẽ tìm hiểu xem DataSet trong C# ADO.NET là gì? các thuộc tính, chức năng và cách sử dụng nó như thế nào. Sau đó là một vài ví dụ cụ thể sử dụng DataSet để các bạn có thể hiểu rõ hơn nhé.
Ở bài trước mình đã giới thiệu về DataTable trong ADO.NET, các bạn có thể xem lại để hiểu rõ cách dùng của nó.
1. DataSet trong C# là gì?
DataSet đại diện cho một tập hợp con của cơ sở dữ liệu trong bộ nhớ. Hay nói cách khác, DataSet là một tập hợp các bảng dữ liệu có chứa dữ liệu quan hệ trong bộ nhớ ở định dạng bảng (table).
Nó không yêu cầu kết nối mở hoặc hoạt động liên tục với cơ sở dữ liệu. DataSet được sử dụng để tìm nạp dữ liệu mà không cần tương tác với bất kì nguồn dữ liệu nào.
Bài viết này được đăng tại [free tuts .net]
*Lưu ý: DataSet là thành phần cốt lõi để cung cấp quyền truy cập dữ liệu trong môi trường phân tán và ngắt két nối (disconnected). Class DataSet thuộc namespace System.Data.
Signature của DataSet trong ADO.NET.
public class DataSet : MarshalByValueComponent, IListSource, IXmlSerializable, ISupportInitializeNotification, ISupportInitialize, ISerializable { }
2. Cấu trúc của DataSet trong C#
Trong phần này chúng ta sẽ tìm hiểu về cấu trúc của DataSet trong ADO.NET. Cụ thể thì DataSet cung cấp 4 hàm tạo sau đây.
public DataSet(); public DataSet(string dataSetName); public DataSet(SerializationInfo info, StreamingContext context); public DataSet(SerializationInfo info, StreamingContext context, bool ConstrucSchema);
Trong đó:
- DataSet(): Khởi tạo một instance mới của class System.Data.DataSet.
- DataSet(string dataSetName): Khởi tạo một instance mới của class System.Data.DataSet với tên đã cho.
- DataSet(SerializationInfo info, StreamingContext context): Khởi tạo một instance mới của class System.Data.DataSet với thông tin dữ liệu và ngữ cảnh (nguồn và đích của một luồng dữ liệu được tuần tự hóa).
- DataSet(SerializationInfo info, StreamingContext context, bool ConstructSchema): Khởi tạo một instance mới của class System.Data.DataSet.
3. Các thuộc tính và phương thức của DataSet trong C#
Trong phần này mình sẽ giới thiệu về các thuộc tính và các phương thức của DataSet trong ADO.NET, đây là một phần khá quan trọng vì vậy các bạn hãy chú ý nhé.
Các thuộc tính của DataSet trong ADO.NET.
- CaseSensitive: Được sử dụng để lấy hoặc đặt một giá trị cho biết liệu các so sánh chuỗi trong các đối tượng System.Data.DataTable có phân biệt chữ hoa hoặc chữ thường hay không. Nó trả về true nếu các so sánh chuỗi là chữ hoa hoặc chữ thường, ngược lại là false (mặc định là false).
- DefaultViewManager: Được sử dụng để có thể xem được chế độ tùy chỉnh dữ liệu có trong System.Data.Set để cho phép lọc, tìm kiếm và điều hướng bằng cách sử dụng System.Data.DataViewManager tùy chỉnh.
- DataSetName: Được sử dụng để lấy hoặc đặt trên của System.Data.DataSet hiện tại.
- EnforceConstraints: Được sử dụng để lấy hoặc đặt một giá trị cho biết liệu các quy tắc ràng buộc có được tuân theo khi thực hiện bất kỳ thao tác cập nhật nào hay không.
- HasErrors: Được sử dụng để nhận một giá trị cho biết liệu có lỗi trong bất kì đối tượng DataTable nào trong DataSet này hay không.
- IsInitialized: Được sử dụng để nhận một giá trị cho biết liệu DataSet có được khởi tạo hay không. Nó trả về true để cho biết thành phần đã được khởi tạo, ngược lại là false.
- Prefix: Được sử dụng để lấy hoặc đặt một tiền tố XML làm bí danh cho namespace System.Data.DataSet.
- Locale: Được sử dụng để lấy hoặc đặt thông tin ngôn ngữ cho việc so sánh các chuỗi trong bảng.
- Namespace: Được sử dụng để lấy hoặc đặt tên namespace của System.Data.DataSet.
- Site: Được sử dụng dể lấy hoặc thiết lập một System.ComponentModel.ISite cho System.Data.DataSet.
- Relations: Được sử dụng để lấy tập hợp các quan hệ liên kết các bảng và cho phép điều hướng từ bảng mẹ sang bảng con.
- Tables: Được sử dụng để lấy tập hợp các bảng có trong System.Data.DataSet.
Các phương thức của DataSet trong ADO.NET.
- BeginInit(): Nó bắt đâu khởi tạo System.Data.DataSet được sử dụng trên một biểu mẫu hoặc được sử dụng bởi một component khác. Quá trình khởi tạo này xảy ra tại thời điểm bắt đầu chạy.
- Clear(): Xóa DataSet của bất kỳ dữ liệu nào, bằng cách xóa tất cả các hàng trong tất cả các bảng.
- Clone(): Sao chép cấu trúc của DataSet, bao gồm tất cả các Schema, quan hệ và ràng buộc DataTable. Nhưng ngược lại nó sẽ không sao chép bất kỳ dữ liệu nào.
- Copy(): Sao chéo cả cấu trúc và dữ liệu của DataSet được chọn.
- CreateDataReader(): Trả về một DataTableReader với một tập kết quả cho mỗi DataTable, theo trình tự giống như các bảng xuất hiện trong System.Data.DataSet.Tables.
- CreateDataReader(params DataTable[] dataTables): Trả về một System.Data.DataTableReader với một tập kết quả cho mỗi System.Data.DataTable.
- EndInit(): Nó kết thúc việc khởi tạo DataSet, được sử dụng trên một biễu mẫu hoặc được sử dụng bởi một component khác.
- GetXml(): Trả về biểu diễn XML của dữ liệu được lưu trữ trong DataSet.
- GetXmlSchema(): Trả về Schema XML cho biểu diễn XML của dữ liệu được lưu trữ trong DataSet.
4. So sánh giữa DataReader và DataSet trong C#
Trong phần này mình sẽ đưa ra một vài chức năng của hai class trong C# ADO.NET đó là DataReader và DataSet, để các bạn có thể so sánh và lựa chọn sử dụng trong các trường hợp khác nhau.
Một vài chức năng của DataSet.
- Khi muốn lưu dữ liệu vào bộ nhớ đệm cục bộ trong ứng dụng của mình để bạn có thể thao tác dữ liệu.
- Khi muốn tương tác động với dữ liệu, tức là ràng buộc dữ liệu với điều khiển winforms.
- Khi muốn làm việc với architecture bị ngắt kết nối.
Một vài chức năng của DataReader.
- Nếu muốn thêm một số chức năng khác được đề cập ở trên, thì cần sử dụng DataReader để làm đa dạng ứng dụng.
- DataReader hoạt động trên architecture kết nối, tức là nó yêu cầu có kết nối mở với cơ sở dữ liệu.
5. Ví dụ sử dụng DataSet trong C#
Trong ví dụ này mình sẽ hướng dẫn cụ thể các bước tạo và sử dụng một DataSet trong C# ADO.NET, các bạn chú ý theo dõi nhé.
Tạo bảng dữ liệu Customer.
// Tạo một bảng Customer DataTable Customer = new DataTable("Customer"); //Tạo các cột và các schema DataColumn CustomerId = new DataColumn("ID", typeof(Int32)); Customer.Columns.Add(CustomerId); DataColumn CustomerName = new DataColumn("Name", typeof(string)); Customer.Columns.Add(CustomerName); DataColumn CustomerMobile = new DataColumn("Mobile", typeof(string)); Customer.Columns.Add(CustomerMobile); //Thêm các hàng dữ liệu vào bảng Customer Customer.Rows.Add(101, "Van Quyen", "118001229"); Customer.Rows.Add(202, "Freetuts.net", "1234567890");
Như các bạn đã thấy, mình đã tạo một DataTable với tên là Customer. Sau đó tạo ba cột dữ liệu và thêm ba cột này vào bảng dữ liệu Customer.
Cuối cùng là tạo hai hàng dữ liệu và thêm hai hàng dữ liệu này vào bảng Customer. Như vậy là chúng ta đã tạo thành công bảng dữ liệu Customer với ba cột và hai hàng dữ liệu
Tạo bảng dữ liệu Orders.
// Tạo bảng Orders DataTable Orders = new DataTable("Orders"); //Tạo các cột và các schema DataColumn OrderId = new DataColumn("ID", typeof(Int32)); Orders.Columns.Add(OrderId); DataColumn CustId = new DataColumn("CustomerId", typeof(Int32)); Orders.Columns.Add(CustId); DataColumn OrderAmount = new DataColumn("Amount", typeof(Int32)); Orders.Columns.Add(OrderAmount); //Thêm các hàng dữ liệu vào bảng Orders Orders.Rows.Add(10001, 101, 20000); Orders.Rows.Add(10002, 102, 30000);
Tương tự như bảng Customer, ở bảng này ta cũng tạo DataTable, sau đó tạo các cột và hàng dữ liệu rồi thêm vào bảng.
Tạo DataSet và DataTable.
//Tạo DataSet DataSet dataSet = new DataSet(); //Thêm các DataTables vào DataSet. dataSet.Tables.Add(Customer); dataSet.Tables.Add(Orders);
Như đã nói ở phần trên, thì DataSet là một tập hợp các DataTable. Vì vậy ta cần tạo một đối tượng DataSet và sau đó thêm hai bảng dữ liệu (Customer và Orders) vào DataSet.
Đưa dữ liệu vào DataTable từ DataSet.
Để đưa dữ liệu vào DataTable từ DataSet ta có thể sử dụng hai cách. Cách thứ nhất là sử dụng vị trí index để thể thêm vào DataTable và cách thứ hai là sử dụng tên bảng (Name).
Sử dụng vị trí index:
foreach (DataRow row in dataSet.Tables[0].Rows) { Console.WriteLine(row["ID"] + ", " + row["Name"] + ", " + row["Mobile"]); }
Vì lần đầu tiên ta thêm bảng Customer vào DataSet nên vị trí index của nó bằng 0. Nếu muốn lặp lại dữ liệu bảng khách hàng thì có thể sử dụng vòng lặp foreach để lặp lại.
Sử dụng tên bảng:
foreach (DataRow row in dataSet.Tables["Orders"].Rows) { Console.WriteLine(row["ID"] + ", " + row["CustomerId"] + ", " + row["Amount"]); }
Ngoài cách sử dụng vị trí index như trên, ta còn có thể sử dụng tên của bảng để thêm dữ liệu vào bằng cách sử dụng vòng lặp foreach.
Full Code.
using System; using System.Data; namespace ConsoleApp4 { class Program { static void Main(string[] args) { try { //tạo mới một bảng có tên Customer DataTable Customer = new DataTable("Customer"); //tạo các cột và các schema của bảng DataColumn CustomerId = new DataColumn("ID", typeof(Int32)); Customer.Columns.Add(CustomerId); DataColumn CustomerName = new DataColumn("Name", typeof(string)); Customer.Columns.Add(CustomerName); DataColumn CustomerMobile = new DataColumn("Mobile", typeof(string)); Customer.Columns.Add(CustomerMobile); //thêm các hàng dữ liệu vào bảng Customer Customer.Rows.Add(101, "Van Quyen", "118001229"); Customer.Rows.Add(202, "Freetuts.net", "1234567890"); //tạo mới một bảng Orders DataTable Orders = new DataTable("Orders"); //tạo các cột vầ các schema của bảng DataColumn OrderId = new DataColumn("ID", typeof(Int32)); Orders.Columns.Add(OrderId); DataColumn CustId = new DataColumn("CustomerId", typeof(Int32)); Orders.Columns.Add(CustId); DataColumn OrderAmount = new DataColumn("Amount", typeof(Int32)); Orders.Columns.Add(OrderAmount); //thêm các hàng dữ liệu vào bảng Orders Orders.Rows.Add(10001, 101, 20000); Orders.Rows.Add(10002, 102, 30000); //tạo mới một instance DataSet DataSet dataSet = new DataSet(); //thêm các datatable vào dataset dataSet.Tables.Add(Customer); dataSet.Tables.Add(Orders); Console.WriteLine("Du lieu trong bang Customer: "); //sử dụng vòng lặp foreach để thêm dữ liệu vào datatable bằng vị trí index foreach (DataRow row in dataSet.Tables[0].Rows) { Console.WriteLine(row["ID"] + ", " + row["Name"] + ", " + row["Mobile"]); } Console.WriteLine(); Console.WriteLine("Du lieu trong bang Orders: "); //sử dụng vòng lặp foreach để thêm dữ liệu vào datatable bằng tên bảng foreach (DataRow row in dataSet.Tables["Orders"].Rows) { Console.WriteLine(row["ID"] + ", " + row["CustomerId"] + ", " + row["Amount"]); } } catch (Exception e) { Console.WriteLine("Co loi xay ra.\n" + e); } Console.ReadKey(); } } }
Kết quả:
Như vậy là chúng ta đã tìm hiểu xong về DataSet trong C# ADO.NET là gì? các thuộc tính, phương thức và cách sử dụng nó. Ở bài tiếp theo mình sẽ tiếp tục hướng dẫn cách thao tác với SQL bằng DataSet, các bạn nhớ chú ý theo dõi nhé !!!