Hướng dẫn sử dụng DataReader, DataSet, DataAdapter and DataTable in C# and VB.NET
Bài viết hôm nay mình sẽ hướng dẫn các bạn sử dụng các đối tượng cơ bản trong ADO.NET: DataReader, DataAdapter, Dataset, Data Table . Cách sử dụng chúng như thế nào trong ngôn ngữ C#, VB.NET. 1. DataReader: Một SqlDataReader ...
Bài viết hôm nay mình sẽ hướng dẫn các bạn sử dụng các đối tượng cơ bản trong ADO.NET: DataReader, DataAdapter, Dataset, Data Table. Cách sử dụng chúng như thế nào trong ngôn ngữ C#, VB.NET.
1. DataReader:
Một SqlDataReader là đối tượng phù hợp để đọc dữ liệu một cách hiệu quả nhất. Như tên gọi, bạn không thể dùng nó để ghi dữ liệu. SqlDataReader thường được mô tả là luồng dữ liệu fast-forward firehose-like (fire-hose: ống vòi rồng).
Bạn có thể đọc dữ liệu từ đối tượng SqlDataReader theo hướng forward-only trong một thứ tự nhất định. Mỗi lần đọc một vài dữ liệu, bạn phải lưu nó nếu cần thiết bởi vì bạn không thể quay trở lại và đọc nó một lần nữa.
Kiểu thiết kế forward-only của SqlDataReader để giúp nó hoạt động nhanh. Nó không thể di chuyển trực tiếp đến các dòng dữ liệu ở vị trí bất kì và không thể ghi vào dữ liệu nguồn. Do đó, nếu bạn chỉ yêu cầu đọc một nhóm dữ liệu một lần và cần phương pháp nhanh nhất, SqlDataReader là lựa chọn tốt nhất.
Source code C#:
string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; using (SqlConnection con = new SqlConnection(constring)) { using (SqlCommand cmd = new SqlCommand("SELECT Name, City FROM Persons", con)) { cmd.CommandType = CommandType.Text; con.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { string name = dr["Name"].ToString(); string city = dr["City"].ToString(); Response.Write("Name: " + name); Response.Write("City: " + city); } con.Close(); } }
Source code VB.NET
Dim constring As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString Using con As New SqlConnection(constring) Using cmd As New SqlCommand("SELECT Name, City FROM Persons", con) cmd.CommandType = CommandType.Text con.Open() Dim dr As SqlDataReader = cmd.ExecuteReader() While dr.Read() Dim name As String = dr("Name").ToString() Dim city As String = dr("City").ToString() Response.Write("Name: " & name) Response.Write("City: " & city) End While con.Close() End Using End Using
2. DataAdapter
Để cho các bạn dễ hiểu DataAdater, từ DataAdapter chính là cầu nối giữa Dataset và Datasource. Mình có thể ví dụ như sau:
Bạn chỉ cần tưởng tượng rằng : bạn có một cái bể nước (DataSource) , một cái máy bơm (DataAdapter) và một cái thùng đựng nước (DataSet). Thì khi lấy nước dùng cái bơm lấy nước từ bể, kiểm tra và lọc nước sau đó lại dùng cái bơm hút lại về cái bể nước. Đó chính là vai trò của cái bơm và DataAdapter tương tự như vậy.
Source code C#
string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; using (SqlConnection con = new SqlConnection(constring)) { using (SqlCommand cmd = new SqlCommand("SELECT Name, City FROM Persons", con)) { cmd.CommandType = CommandType.Text; using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) { DataSet ds = new DataSet(); sda.Fill(ds); foreach (DataRow row in ds.Tables[0].Rows) { string name = row["Name"].ToString(); string city = row["City"].ToString(); Response.Write("Name: " + name); Response.Write("City: " + city); } } } }
Source code VB.NET
Dim constring As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString Using con As New SqlConnection(constring) Using cmd As New SqlCommand("SELECT Name, City FROM Persons", con) cmd.CommandType = CommandType.Text Using sda As New SqlDataAdapter(cmd) Dim ds As New DataSet() sda.Fill(ds) For Each row As DataRow In ds.Tables(0).Rows Dim name As String = row("Name").ToString() Dim city As String = row("City").ToString() Response.Write("Name: " & name) Response.Write("City: " & city) Next End Using End Using End Using
3. DataSet
DataSet là một đối tượng có thể chứa nhiều DataTable cùng với mối liên hệ giữa chúng (relationship) và kể các ràng buộc (constraint) được lưu hoàn toàn trong bộ nhớ để làm việc offline. Qua bài viết này, bạn có thể hiểu cấu trúc của DataSet, DataTable cũng như nạp dữ liệu, tạo relation, constraint và thao tác dữ liệu trên các đối tượng dữ liệu này.
DataSet trong ADO.NET là một bước phát triển lớn trong việc phát triển ứng dụng cơ sở dữ liệu đa hệ. Khi lấy và chỉnh sửa dữ liệu, duy trì liên tục kết nối tới Data Source trong khi chờ user yêu cầu thì rõ ràng là tốn tài nguyên máy rất nhiều.
DataSet giúp ích ở đây rất lớn. Vì DataSet cho phép lưu trữ dữ liệu và chỉnh sửa tại ‘local cache’, hay gọi là offline mode. Có thể xem xét và xử lý thông tin trong khi ngắt kết nối. Sau khi chỉnh sửa và xem xong thì tạo một kết nối và update dữ liệu từ local vào Data Source.
Source code C#
string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; using (SqlConnection con = new SqlConnection(constring)) { using (SqlCommand cmd = new SqlCommand("SELECT Name, City FROM Persons", con)) { cmd.CommandType = CommandType.Text; using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) { DataSet ds = new DataSet(); sda.Fill(ds); foreach (DataRow row in ds.Tables[0].Rows) { string name = row["Name"].ToString(); string city = row["City"].ToString(); Response.Write("Name: " + name); Response.Write("City: " + city); } } } }
Source code VB.NET
Dim constring As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString Using con As New SqlConnection(constring) Using cmd As New SqlCommand("SELECT Name, City FROM Persons", con) cmd.CommandType = CommandType.Text Using sda As New SqlDataAdapter(cmd) Dim ds As New DataSet() sda.Fill(ds) For Each row As DataRow In ds.Tables(0).Rows Dim name As String = row("Name").ToString() Dim city As String = row("City").ToString() Response.Write("Name: " & name) Response.Write("City: " & city) Next End Using End Using End Using
4. Data Table
Nằm trong lớp : System.Data.DataTable. Có cấu trúc theo cấu trúc của bảng trong cơ sở dữ liệu gồm các hàng và cột nên có 2 thành phần kèm theo là : DataRow và DataColumn
DataRow sẽ là tập hợp các cột (record-set).
Một Dataset có thể chứa một hoặc nhiều Data Table
Source code C#
string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; using (SqlConnection con = new SqlConnection(constring)) { using (SqlCommand cmd = new SqlCommand("SELECT Name, City FROM Persons", con)) { cmd.CommandType = CommandType.Text; using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); sda.Fill(dt); foreach (DataRow row in dt.Rows) { string name = row["Name"].ToString(); string city = row["City"].ToString(); Response.Write("Name: " + name); Response.Write("City: " + city); } } } }
Source code VB.NET
Dim constring As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString Using con As New SqlConnection(constring) Using cmd As New SqlCommand("SELECT Name, City FROM Persons", con) cmd.CommandType = CommandType.Text Using sda As New SqlDataAdapter(cmd) Dim dt As New DataTable() sda.Fill(dt) For Each row As DataRow In dt.Rows Dim name As String = row("Name").ToString() Dim city As String = row("City").ToString() Response.Write("Name: " & name) Response.Write("City: " & city) Next End Using End Using End Using
So sánh DataSet và DataReader
Nếu bạn đơn giản chi muốn lấy dữ liệu và trình bày nó ra thôi thì dùng DataReader. Đặc biệt trường hợp mà bạn đọc với một số lượng lớn dữ liệu, ví như là vòng lặp tới hàng triệu dòng kết quả dữ liệu, bạn muốn tốc độ đọc nhanh và trình bày nhanh thì DataReader được sử dụng cho mục đích này, NHANH và TIỆN LỢI, cho việc ĐỌC dữ liệu.
Nếu bạn muốn chỉnh sử dữ liệu rồi update thông tin dữ liệu lại database thì bạn sử dụng DataSet. DataAdapter lấp đầy (fill) dữ liệu vào DataSet bằng cách sử dụng một DataReader, thêm vào đó resource cần được lưu trữ vào để sử dụng khi ngắt kết nối. Vì vậy việc sử dụng DataSet tốn nhiều tài nguyên hơn DataReader rất nhiều, bạn cần cân nhắc ở đây lúc nào sử dụng thành phần nào thì tốt, tránh lạm dụng quá. Nếu như bạn muốn đọc dữ liệu và viết ra dưới dạng XML, hoặc export database schema, viết lại db dưới dạng XML,…. thì nên sử dụng DataReader.
HAVE FUN ^^