Tài liệu Hướng dẫn sử dụng DataSet để xử lý kết quả kết hợp với Data Adapter - Pdf 98

Sử dụng DataAdapter và DataSet Author : Xcross87 2007
Ở bài trước bạn đã biết cách xử lý và hiện kết quả ra màn hình dùng Data Reader. Chú ý rằng : nếu chỉ
muốn xem thông tin thì dùng Data Reader.
Bài này hướng dẫn sử dụng DataSet để xử lý kết quả kết hợp với DataAdapter. Không giống với
DataReader, tạo ra các đối tượng dùng interface System.DataIDataReader, thì DataSet là một thành phần
đặc trưng của ADO.NET được sử dụng bởi tất cả các nhà cung cấp dữ liệu (data provider). Dataset có thể
hoàn toàn độc lập và sử dụng khi kết nối hoặc ngắt kết nối khỏi nguồn. Mục đích cơ bản của DataSet là
cung cấp xử lý xem xét dữ liệu lưu trữ trong một ‘memory cache’. Nếu như một DataSet không kết nối
tới cơ sở dữ liệu thì làm sao mà xử lý dữ liệu và save lại vào database ? Đây là lí do mà DataAdapter ra
đời. Hãy nghĩ DataAdapter chính là một chiếc cầu nối giữa DataSet và Data Source. Nếu không có một
DataAdapter nào thì DataSet không thể truy cập bất cứ DataSource nào. DataAdapter đảm bào việc kết
nối và truyền thông tin cho DataSet.
Tìm hiểu về ObjectModel
Đầu tiên thì mình đưa ra một số so sánh giữa DataSet và DataReader nhé, để các bạn tránh hay hỏi nhiều
về việc : Lúc nào thì xài DataSet và lúc nào thì xài DataReader, giống và khác nhau như thế nào ?
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.
Giới thiệu sơ qua về DataSet
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

Sử dụng DataAdapter và DataSet Author : Xcross87 2007
DataColumn là tập hợp các hàng cùng một đặc tính. (Field)
Ví dụ :
[code]
DataTable dt = new DataTable();
DataColumn col = dt.Columns[“Contact”]; // Cột Contact
DataColumn col = dt.Columns[2];
DataRow row = dt.Rows[2];
[/code]
Vậy là đủ giới thiệu qua. Bây giờ vào vấn đề chính nào.
Làm việc với DataSet và DataAdapter
Tạo một dataset :
[code]
DataSet ds = new DataSet();
DataSet ds = new DataSet(“DataSet Name”);
[/code]
Nếu bạn dùng cách 1 thì theo mặc định DataSet sẽ có tên là “NewDataSet”, cách thứ 2 là bạn đặt tên luôn
cho DataSet bên trong constructor. Hoặc bạn có thẻ thay đổi tên của DataSet bằng thuộc tính
‘DataSetName’
Có nhiều cách xử lý với DataSet như
• Sử dụng thông qua Adapter
• Đọc từ một tài liệu XML
Cách thứ 2 đễ lúc khác nhé. Làm cơ bản trước đã.
Thử xử lý dữ liệu bằng một ví dụ :
[code]
using System;
using System.Data;
using System.Data.SqlClient;
Page 4 of 20
Sử dụng DataAdapter và DataSet Author : Xcross87 2007

foreach (DataColumn col in dt.Columns)
Console.WriteLine(row[col]);
Console.WriteLine("".PadLeft(20, '='));
}
}
catch (Exception e)
{
// Bắt lỗi
Console.WriteLine(e.Message);
}
finally
{
// Đóng kết nối
conn.Close();
}
}
}
}
[/code]
Phân tích bài đơn giản ở trên nha.
Sau khi đã mở kết nối thì ta tạo một Adapter. Adapter này chứa thông tin về SQL query cần thực thi và
một đối tượng kết nối conn, sau đó tạo một DataSet. Lúc này thì DataSet chưa có gì. Sau đó lấp đầy kết
quả vào DataSet bằng method ‘Fill’ của Adapter. Từ đó hiểu thêm rằng : Adapter tự động thực thi câu
Page 5 of 20
Sử dụng DataAdapter và DataSet Author : Xcross87 2007
lệnh SQL , thu lấy kết quả và gán hết vào DataSet. Khác với DataReader cần có một đối tượng
SqlComnmand đễ xử lý. Nếu khi lấp đầy kết quả vào DataSet mà không gán tên bảng nào thì tự động
trong DataSet tên lần lượt từng bảng là ‘TableN’ với bảng đầu tiên là Table, Table1,Table2…TableN.
Nếu một query được thực thi lại nhiều lần thì DataSet sẽ cập nhật thông tin từng đó bảng vào trong .
Chú ý trong Adapter ở trên nếu thay bằng cách tạo Adapter dưới đây :

// Tạo connection
SqlConnection conn = new SqlConnection(connString);
try
{
// Tạo Adapter
SqlDataAdapter da = new SqlDataAdapter();
Page 6 of 20
Sử dụng DataAdapter và DataSet Author : Xcross87 2007
da.SelectCommand = new SqlCommand(sql, conn);
// Tạo và lấp đầy DataSet
DataSet ds = new DataSet();
da.Fill(ds, "customers");
// Lấy Data Table Collection
DataTableCollection dtc = ds.Tables;
// Xử lý Table thứ nhất
Console.WriteLine("Result from Customers table : ");
Console.WriteLine("Company Name".PadRight(20) + "Contact
Name".PadLeft(23) + "\n");
// Thiệt lập Filter
string filter = "country = 'Germany'";
// Thiết lập Sort
string sort = "companyname ASC";
// Hiển thị thông tin đã sort và filter
foreach (DataRow row in dtc["customers"].Select(filter, sort))
{
Console.WriteLine("{0}\t{1}",

row["companyname"].ToString().PadRight(20),
row["contactname"]);
}

Sử dụng DataAdapter và DataSet Author : Xcross87 2007
Hay à nha…:D
Code này ở đây nhiều chỗ hơi bị phong độ đây. Chú ý và cẩn thận nhé. Cố gắng nhớ những gì tớ trình bày
ở đây nè, hơi rắc rối một chút đây. ^_^!
Ở đây xử lý 2 query sql1 và sql2 và chúng được combine vào thành 1 chuỗi query sql.
Adapter tạo ra thực thi 2 query này. Vậy thì xử lý dữ liệu thế nào ? Từ từ để sau
Sau đó lấp đầy DataSet . Chú ý cài này :
[code]
da.Fill(ds, “customers”);
[/code]
Nhắc lại nào, 2 query ở trên là gọi dữ liệu từ 2 bảng : ‘customers’ và ‘products’. Ở đây là lấp đầy
‘customers’. Sau đó bạn xem đến hết code, không hề thấy lấp đầy thằng ‘products’ mà vẫn in ra kết quả
của bảng đó. Vậy là sao ?. Cái đó thì phải hỏi xem thằng Fill làm việc thế nào.
Bây giờ bạn thử chèn thêm xuống dưới cùng trong khối ‘try’ đoạn code sau để phân tích thằng Fill
[code]
Console.WriteLine(ds.Tables[0]);
Console.WriteLine(ds.Tables[1]);
[/code]
Nghĩa là in ra tên 2 bảng trong DataSet. Bạn sẽ thấy bảng đầu tiên là ‘customers’ còn bảng tiếp theo là
‘customer1’.
Sau đó bạn thử ‘foreach’ lấy hết kết quả của customers1 ra check thì nó chính là kết quả thu được từ
query vào bảng ‘products’.
Từ đó có thể suy luận ra cách làm việc của Fill, đầu tiên ta nhớ lại là DataSet là lưu trữ một loạt các
Tables, khi Fill thì Adapter sẽ lấp đầy tất cả các kết quả từ các Table vào DataSet. Vậy thì ở đây sau khi
đã query 2 tables thì fill lần lượt từ ‘customer’ đến ‘products’ với các Table sau customer bị đổi tên thành
‘customerN’ hết.
Để muốn lấy lại tên ban đầu cho ‘products’ thì bạn chỉ cần thay đổi tên đi là được :
[code]
ds.Tables[1].TableName = “products”;
[/code]

Hì hì, vấn đề ở chỗ tớ viết trên cùng về cái máy bơm. Cái máy bơm thông với cái bể, bây giờ truyền nước
và không truyền nước là do cái máy bơm quyết định. Cũng vậy ở đây bạn so sánh 2 cái ví dụ ở trên, một
Page 9 of 20
Sử dụng DataAdapter và DataSet Author : Xcross87 2007
cái mở kết nối conn.Open() còn cái ví dụ dưới thì không cần mở. Nhắc lại method Fill(), method này là
một đặc trưng của ADO.NET được cung cấp để truyền dữ liệu các DataSet và nó TỰ ĐỘNG mở kết nối
khi gọi nó nếu như kết nối không được mở. Và sau khi fill vào DataSet thì lại tự động đóng kết nối. Mọi
việc ở đây nằm trong quyền kiểm soát của cái Adapter hết. Bạn có thể tự kiểm tra tình trạng kết nối State
để xác minh.
Sử dụng DataView
DataView được dùng để xem thông tin dữ liệu của một bảng, giống như SQL view, thêm nữa nó không
giữ một tí dữ liệu nào.
Vi dụ : Sử dụng DataView
[code]
using System;
using System.Data;
using System.Data.SqlClient;
namespace MSSQL_Server
{
class Database
{
static void Main(string[] args)
{
// Tạo connection strin
string connString = @"Server = .\SQLEXPRESS;
Integrated Security = True;
Database = Northwind";
// Tạo SQL query
string sql = @"SELECT contactname, country FROM customers ";
// Tạo connection

}
finally
{
// Đóng kết nối
conn.Close();
}

}
}
}
[/code]
Có thể thấy cách tạo một DataView rất đơn giản.
Với 4 đối số : a. tên Table b.filter c. sort d.DataViewRowState enum
Giải thích một chút về DataViewRowState
• Added : dòng mới
• CurrentRows : các dòng hiện tại, chưa bị thay đổi, mới và đã bị sửa đổi
• Deleted : dòng đã xóa
• ModifiedCurrent : giá trị đã sửa của dòng đã sửa
• ModifiedOriginal : giá trị trước khi sửa của dòng đã sửa
• None : Không lấy dòng nào
• OriginalRows : tất cả dòng ban đầu
• Unchanged : một dòng chưa bị sửa đổi.
Mỗi thao tác của bạn sẽ có thể làm thay đổi RowState, vì vậy nên chú ý và sử dụng cho hợp lý.
Sửa dữ liệu trong DataSet
Dưới đây là minh họa sửa đổi dữ liệu trong DataSet. Nên nhớ là thay đổi trong dataset không hề ảnh
hưởng gì đến Data Source. Muốn thay đổi trong Data Source thì phải tạo một kết nối tới database và
update dữ liệu thay đổi lên thông qua DataSet và DataAdapter.
[code]
using System;
using System.Data;

// Thay đổi City của Row đầu tiên
dt.Rows[0]["City"] = "Seoul";
// Thêm một dòng mới nha
DataRow newRow = dt.NewRow();
newRow["FirstName"] = "Pete";
newRow["LastName"] = "Houston";
newRow["TitleOfCourtesy"] = "Sir";
newRow["City"] = "Seoul";
newRow["Country"] = "South Korea";
dt.Rows.Add(newRow);
// Add xong hiển thị thông tin từ DataSet ra màn hình xem
// đã update chưa
foreach (DataRow row in dt.Rows)
{
Console.WriteLine("{0} {1} {2}",
row["FirstName"].ToString().PadRight(10),
row["LastName"].ToString().PadLeft(10),
row["City"]);
}
}
catch (Exception e)
{
// Bắt lỗi
Console.WriteLine(e.Message);
}
finally
{
// Đóng kết nối
conn.Close();
}

[code]
using System;
using System.Data;
using System.Data.SqlClient;
Page 13 of 20
Sử dụng DataAdapter và DataSet Author : Xcross87 2007
namespace MSSQL_Server
{
class Database
{
static void Main(string[] args)
{
// Tạo connection strin
string connString = @"Server = .\SQLEXPRESS;
Integrated Security = True;
Database = Northwind";
// Tạo SQL query
string qry = @"SELECT * FROM employees WHERE country = 'UK' ";
string upd = @"UPDATE employees SET city = @city WHERE employeeid
= @employeeid ";
// Tạo connection
SqlConnection conn = new SqlConnection(connString);
try
{
// Tạo Adapter
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(qry, conn);
// Tạo và lấp đầy DataSet
DataSet ds = new DataSet();
da.Fill(ds, "employees");

}
finally
{
// Đóng kết nối
conn.Close();
}

}
}
}
[/code]
Để biết code trên ra kết quả thế nào thì, mở SQL Server Management Studio 2005 Express ra rồi run
query sau :
[code]
use Northwind
SELECT firstname,lastname,city
FROM employees
WHERE country = 'UK'
[/code]
Bạn sẽ thu được các value cần thiết. Sau đó run code ở trên, rồi run lại query SQL trên, sẽ thấy dòng trên
cùng city sẽ bị thay đổi thành Seoul.
Thuộc tính InsertCommand
Ví dụ thử Insert thêm một dòng heng
[code]
using System;
using System.Data;
using System.Data.SqlClient;
namespace MSSQL_Server
{
class Database

newRow["lastname"] = "Houston";
newRow["titleofcourtesy"] = "Sir";
newRow["city"] = "Seoul";
newRow["country"] = "South Korea";
dt.Rows.Add(newRow);
// Hiển thị thông tin các rows trong DataSet
foreach (DataRow row in dt.Rows)
{
Console.WriteLine("{0} {1} {2}",
row["firstname"].ToString().PadRight(15),
row["lastname"].ToString().PadLeft(15),
row["city"]);
}
// Làm việc với Insert
SqlCommand cmd = new SqlCommand(ins, conn);
cmd.Parameters.Add("@firstname", SqlDbType.NVarChar, 10,
"firstname");
cmd.Parameters.Add("@lastname", SqlDbType.NVarChar, 20,
"lastname");
cmd.Parameters.Add("@titleofcourtesy", SqlDbType.NVarChar, 25,
"titleofcourtesy");
cmd.Parameters.Add("@city", SqlDbType.NVarChar, 15, "city");
cmd.Parameters.Add("@country", SqlDbType.NVarChar, 15,
"country");
// Tiến hành insert vào database Source
da.InsertCommand = cmd;
da.Update(ds, "employees");

}
catch (Exception e)

namespace MSSQL_Server
{
class Database
{
static void Main(string[] args)
{
// Tạo connection strin
string connString = @"Server = .\SQLEXPRESS;
Integrated Security = True;
Database = Northwind";
// Tạo SQL query
string qry = @"SELECT * FROM employees WHERE country = 'UK' ";
// Tạo connection
SqlConnection conn = new SqlConnection(connString);
try
{
// Tạo Adapter
Page 17 of 20
Sử dụng DataAdapter và DataSet Author : Xcross87 2007
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(qry, conn);
// Tạo commandbuider
SqlCommandBuilder cb = new SqlCommandBuilder(da);
// Tạo và lấp đầy DataSet
DataSet ds = new DataSet();
da.Fill(ds, "employees");
// Lấy thông tin Table vào DataTable
DataTable dt = ds.Tables["employees"];
// Tạo thêm row mới
DataRow newRow = dt.NewRow();

[/code]
Thấy hay không? Dùng SqlCommandBuilder thì bỏ đi được bao nhiêu đoạn cần thiết. So sánh với bài
InsertCommand ở trên chắc là ngắn hơn được ¼ mà đọc code dễ hiểu hơn.
DataSet và XML
Bạn muốn extract dữ liệu trong DataSet ra một file định dạng XML ?
Page 18 of 20
Sử dụng DataAdapter và DataSet Author : Xcross87 2007
Liệu có cần đòi hỏi kiến thức XML để làm việc ? heheh . Không cần biết về XML vẫn extract được
Một ví dụ viết lưu dữ liệu trong DataSet dưới dạng XML.
[code]
using System;
using System.Data;
using System.Data.SqlClient;
namespace MSSQL_Server
{
class Database
{
static void Main(string[] args)
{
// Tạo connection strin
string connString = @"Server = .\SQLEXPRESS;
Integrated Security = True;
Database = Northwind";
// Tạo SQL query
string qry = @"SELECT firstname,lastname, city FROM employees
WHERE country = 'UK' ";
// Tạo connection
SqlConnection conn = new SqlConnection(connString);
try
{

Bạn sẽ thấy thẻ <NewDataSet> chính là name của DataSet. Bạn có thể tùy ý thay đổi DataSetName
Thêm một chú ý nữa : bạn có thể dùng DataTable để lấy thông tin trong bảng từ DataAdapter thông qua
method Fill
da.Fill(dt);
Trong ADO.NET có một thành phần rất đặc biệt có tên là Typed DataSet. Mình sẽ nói về cái này sau.
Bài viết có lẽ quá dài nên kết thúc ở đây.
Page 20 of 20


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status