
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 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. ỉ ử ạ ộ ế ố ữ ệ ừ
D li u trong DataSet đ c l u tr d i d ng m t Collection các Tables và b n c n ph i xữ ệ ượ ư ữ ướ ạ ộ ạ ầ ả ử
lý thông qua các l p DataTable -> DataRow và DataColumn.ớ
B ng d i đây là ki n trúc DataSet.ả ướ ế

Gi i thi u v DataAdapterớ ệ ề
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. ^_^! Gi i thích h i chu i. :Dủ ơ ươ ự ư ậ ả ơ ố
T ng quan 3 l p nh th này :ươ ớ ư ế

Có 4 cách t o DataAdapter :ạ
[code]
// Cách 1 : Đ n gi n ch khai báo t o đ i t ng Adapterơ ả ỉ ạ ố ượ
SqlDataAdapter da = new SqlDataAdapter();
// Cách 2 : Thi t l p đ i t ng SqlCommandế ậ ố ượ
SqlDataAdapter da = new SqlDataAdapter(cmd);
// Cách 3 : Thi t l p query và đ i t ng SqlConnectionế ậ ố ượ
SqlDataAdapter da = new SqlDataAdaoter(sql, conn);
// Cách 4 : Thi t l p query và m nh l nh th c thi ế ậ ệ ệ ự
SqlDataAdapter da = new SqlDataAdapter(sql, connString);
Gi i thi u v DataTable và thành ph n kèmớ ệ ề ầ
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)ẽ ậ ợ ộ
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;
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 productname, unitprice FROM products WHERE
unitprice < 20";
// T o connectionạ
SqlConnection conn = new SqlConnection(connString);
try
{
// M k t n iỏ ế ố
conn.Open();
// T o Adapterạ
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
// T o DataSetạ
DataSet ds = new DataSet();
// L p đ y k t qu vào DataSetấ ầ ế ả
da.Fill(ds, "products");
// T o DataTable thu k t qu t b ngạ ế ả ừ ả
DataTable dt = ds.Tables["products"];
// In k t qu ra Consoleế ả
foreach (DataRow row in dt.Rows)
{
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 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 :ở ế ằ ạ ướ
[code]
// T o Adapterạ
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(sql, conn);
[/code]
Thì k t qu thu đ c gi ng h t nhau, không có gì thay đ i.ế ả ượ ố ệ ổ
DataSet có th ch a nhi u table vì th khi x lý Table nào c n ph i gán vào DataTable m t tênể ứ ề ế ử ầ ả ộ
table c th . Và cu i cùng dùng DataColumn và DataRow đ x lý DataTable đó. Đó là cáchụ ể ố ể ử
extract d li u t DataSet.ữ ệ ừ
Phân lo i và S p x p trong DataSetạ ắ ế
Th ví d d i đây :ử ụ ướ
[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 sql1 = @"SELECT * FROM customers ";
string sql2 = @"SELECT * FROM products WHERE unitprice < 10 ";

