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 ";