Cách sử dụng Data Readers

Cách sdng Data Readers  
Author : Xcross87  
2007  
Ở bài trước mình đã giới thiu vcách viết SQL statement và thc thi (execute) câu lnh. bài này mình  
stóm tt vcác sdng Data Readers.  
Data Readers được dùng để :  
Thu nhn kết qutcác query  
Ly thông tin vcác ct các hàng trong bng dliu  
Ly thông tin result set  
Ly thông tin vschema  
Xlý các result sets  
Tng quát vData Readers (Data Readers in General)  
Thành phn thba ca nhà cung cp dliệu là „data reader‟, 2 thành phần trước là „connection‟ và  
„command. Một khi đã tạo được kết ni tới cơ sở dliu và thi hành các lnh query thì chúng ta cn mt  
phương thức nào đó để htrcách xlý dliu thu nhận được. Nếu bạn đã biết vADO thì mt  
ADO.NET data reader giống như là ADO recordset một chiu phía client, chkhông phi là một đối  
tượng COM.  
Data readers là các đối tượng đưc cung cp trong lớp interface „System.Data.IdataReader‟. Một „data  
reader‟ có thgi là một stream đã kết ni tới cơ sở dliệu đọc dliu hiu qu, theo mt chiu và thu  
nhn dliu theo tng dòng (row).Vì vy không thtrc tiếp xlý data reader mà phi xlý thông qua  
phương thức „ExecuteReader‟ của một đối tượng command. dụ  
[code]  
SqlConnection conn = new SqlConnection(connectionString);  
SqlCommand cmd = new SqlCommand(new string(“query command”), conn);  
SqlDataReader reader = cmd.ExecuteReader();  
[/code]  
Đoạn code trên là minh ha cách to một đối tượng trong lp SqlDataReader.  
Chú ý: Quy tc chung khi sdụng data reader dơn giản là chthu nhn và trình bày kết quthu  
được.Phân bit data reader vi dataset, cả 2 đều được to ra vi mục đích khác nhau mặc dù cách nhìn  
nhận chung thì đều thu nhn kết qu.  
Thmt vài ví dlàm vic vi Data Reader  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
public class ThiHanhMenhLenh  
{
Page 1 of 9  
Cách sdng Data Readers  
Author : Xcross87  
2007  
public static void Main()  
{
// To connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// To query  
string sql = @"SELECT contactname FROM customers";  
try  
{
// Mkết ni  
conn.Open();  
// To command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// To Data Reader  
SqlDataReader reader = cmd.ExecuteReader();  
while (reader.Read())  
{
Console.WriteLine(" {0} ", reader[0]);  
}
reader.Close();  
}
catch (SqlException sqle)  
{
// Thông báo li  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết ni  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Trong vòng lp thu kết qucủa „data reader‟ (reader) phương thức „Read()‟ trỏ đến giá trhàng tiếp theo  
(nếu có) . Bn chất khi reader đã có kết qusau khi thc thi query thì reader nm gitoàn brecord thu  
được. vì vy có thể dùng index để gọi đến mt giá trbt kì trong kết quả thu được nm trong gii hn ca  
bound.  
Cui cùng thì phải đóng lại reader. Ti sao đóng ? Vì khi đã kết nối và reader được gn vào kết ni thì  
reader snm ở đó để ly dliu khi xlý. Cứ tưởng tượng mt ngôi nhà mà chỉ có người vào không có  
người ra thì đến một lúc nào đó sẽ không vào được na mà muốn ra cũng không được. Tương tự như vy,  
phải đóng lại reader sau mi lần đọc.  
dụ dưới đây minh họa cách sdng index gi giá trcolumn khi Read()  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
Page 2 of 9  
Cách sdng Data Readers  
Author : Xcross87  
2007  
public class ThiHanhMenhLenh  
{
public static void Main()  
{
// To connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// To query  
string sql = @"SELECT companyname,contactname FROM customers WHERE  
contactname LIKE 'M%'";  
try  
{
// Mkết ni  
conn.Open();  
// To command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// In headings  
Console.WriteLine("\t{0} {1}", "Company Name".PadRight(25),  
"Contact Name".PadRight(20));  
Console.WriteLine("\t{0} {1}", "============".PadRight(25),  
"============".PadRight(20));  
// To Data Reader  
SqlDataReader reader = cmd.ExecuteReader();  
while (reader.Read())  
{
Console.WriteLine("{0} | {1}",  
reader[0].ToString().PadLeft(25),reader[1].ToString().PadLeft(20));  
}
reader.Close();  
}
catch (SqlException sqle)  
{
// Thông báo li  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết ni  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Kết quả thu được trong reader thu vlà kiu object . Vì vy trên mình convert các object sang kiu  
string (ToString()) sau đó căn lề. Cuối cùng đóng kết nối để gii phóng khi kết ni.  
Nhiều lúc cũng chẳng biết là ct smy vtrí nào hơi phức tp. Lp SqlDataReader cung cấp cho đối  
tượng cách chỉ định index bng tên ct.  
[code]  
Page 3 of 9  
Cách sdng Data Readers  
Author : Xcross87  
2007  
reader[“companyname”].ToString().PadLeft(25);  
reader[“contactname”].ToString().PadLeft(20);  
[/code]  
Tuy nhiên 2 cách trên đều không tối ưu. Vì khi truy cp vào bng dliu kết quả thu được gitm thi  
theo kiu ca .NET chkhông phi kiểu ban đầu trong tài nguyên. Hai cách trên mi ln ly mt kết  
quả đều kim tra xem dliu kiu gì và convert kiu nên không tối ưu.  
Do đó phương thức ly dliu theo kiểu được cung cp , tt cbắt đầu với „Get‟  
Dưới đây là 2 bảng dliệu tương ứng các kiu dliu trong SQLServer và OLE DB vi .NET  
Bng 1 : Kiu dliu trong SQL Server và .NET  
SQL Server  
.NET  
Phương thức truy cp  
GetInt64  
Int64  
Bigint  
Binary  
Bit  
Byte[]  
Boolean  
GetBytes  
GetBoolean  
String hoc Char[]  
DateTime  
Decimal  
GetString hoc GetChars  
GetDateTime  
GetDecimal  
Char  
Datetime  
Decimal  
Float  
Double  
GetDouble  
Byte[]  
Int32  
GetBytes  
GetInt32  
Image hoc long varbinary  
Int  
Decimal  
GetDecimal  
Money  
String hoc Char[]  
String hoc Char[]  
Decimal  
GetString hoc GetChars  
GetString hoc GetChars  
GetDecimal  
Nchar  
Ntext  
Numeric  
String hoc Char[]  
Single  
GetString hoc GetChars  
GetFloat  
Nvarchar  
Real  
DateTime  
Inte16  
GetDateTime  
GetInt16  
Smalldatetime  
Smallint  
Decimal  
Object  
String hoc Char[]  
Byte[]  
Byte  
GetDecimal  
GetValue  
GetString hoc GetChars  
GetBytes  
GetByte  
Smallmoney  
Sql_variant  
Long varchar  
Timestamp  
Tinyint  
Guid  
Byte[]  
String hoc Char[]  
GetGuid  
GetBytes  
GetString hoc GetChars  
Uniqueidentifier  
Varbinary  
Varchar  
Bng 2 : Kiu dliu trong OLE DB và .NET  
Page 4 of 9  
Cách sdng Data Readers  
Author : Xcross87  
2007  
OLE DB  
DBTYPE_I8  
.NET  
Phương thức truy cp  
GetInt64  
Int64  
Byte[]  
Boolean  
String  
GetBytes  
DBTYPE_BYTES  
DBTYPE_BOOL  
DBTYPE_BSTR  
DBTYPE_STR  
GetBoolean  
GetString  
GetString  
GetDecimal  
GetDateTime  
GetDateTime  
GetDateTime  
GetDateTime  
GetDecimal  
GetDouble  
GetValue  
String  
Decimal  
DateTime  
DateTime  
DateTime  
DateTime  
Decimal  
Double  
ExternalException  
DateTime  
Guid  
DBTYPE_CY  
DBTYPE_DATE  
DBTYPE_DBDATE  
DBTYPE_DBTIME  
DBTYPE_DBTIMESTAMP  
DBTYPE_DECIMAL  
DBTYPE_R8  
DBTYPE_ERROR  
DBTYPE_FILETIME  
DBTYPE_GUID  
DBTYPE_I4  
GetDateTime  
GetGuid  
GetInt32  
Int32  
String  
Decimal  
Single  
GetString  
GetDecimal  
GetFloat  
DBTYPE_LONGVARCHAR  
DBTYPE_NUMERIC  
DBTYPE_R4  
Int16  
GetInt16  
DBTYPE_I2  
Byte  
GetByte  
DBTYPE_I1  
Uint64  
Uint32  
Uint16  
String  
Object  
String  
GetValue  
GetValue  
GetValue  
GetString  
GetValue  
DBTYPE_UI8  
DBTYPE_UI4  
DBTYPE_UI2  
DBTYPE_VARCHAR  
DBTYPE_VARIANT  
DBTYPE_NVARCHAR  
DBTYPE_WSRT  
GetString  
GetString  
String  
dbng Products trong Northwind  
Tên ct  
ProductID (unique)  
ProductName  
SupplierID  
CategoryID  
QuantityPerUnit  
UnitPrice  
Kiu dliu  
Độ dài  
Cho phép NULLS?  
No  
No  
Int  
4
40  
4
4
20  
8
2
2
2
1
Nvarchar  
Int  
Yes  
Yes  
Yes  
Yes  
Yes  
Yes  
Yes  
No  
Int  
Nvarchar  
Money  
Smallint  
Smallint  
Smallint  
Bit  
UnitInStock  
UnitsOnOrder  
ReorderLevel  
Discontinued  
Dưới đây là đoạn code minh ha cách sdụng phương thức truy cp theo kiu dliu :  
Page 5 of 9  
Cách sdng Data Readers  
Author : Xcross87  
2007  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
public class ThiHanhMenhLenh  
{
public static void Main()  
{
// To connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// To query  
string sql = @"SELECT productname, unitprice, unitsinstock,  
discontinued FROM products";  
try  
{
// Mkết ni  
conn.Open();  
// To command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// To Data Reader  
SqlDataReader reader = cmd.ExecuteReader();  
while (reader.Read())  
{
Console.WriteLine("{0}\t{1}\t\t{2}\t{3}",  
reader.GetString(0).PadRight(30),  
reader.GetDecimal(1).ToString().PadLeft(8),  
reader.GetInt16(2),  
reader.GetBoolean(3));  
}
reader.Close();  
}
catch (SqlException sqle)  
{
// Thông báo li  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết ni  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Ly thông tin vData  
Ví dụ dưới đây lấy thông tin vschema ca bng :  
Page 6 of 9  
Cách sdng Data Readers  
Author : Xcross87  
2007  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
using System.Xml;  
public class DataReader  
{
public static void Main()  
{
// To connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// To query  
string sql = @"SELECT productname, unitprice, unitsinstock,  
discontinued FROM products";  
try  
{
// Mkết ni  
conn.Open();  
// To command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// To Data Reader  
SqlDataReader reader = cmd.ExecuteReader();  
DataTable table = reader.GetSchemaTable();  
foreach (DataRow row in table.Rows)  
{
foreach (DataColumn col in table.Columns)  
{
Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);  
}
Console.WriteLine("===========================");  
}
reader.Close();  
}
catch (SqlException sqle)  
{
// Thông báo li  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết ni  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Page 7 of 9  
Cách sdng Data Readers  
Author : Xcross87  
2007  
Ở đây dùng „GetSchemaTable‟ để ly về thông tin Schema, như tên gọi thì kết qutrvkiu DataTable.  
Vì vy ta phi xlý DataTable bng DataRow và DataColumn.  
Bảng dưới đây là các method được cung cấp để ly thông tin vdliu  
Phương thức hoc Đặc tính  
Depth – ĐT  
Chú thích  
Lấy độ sâu ca Row hin ti  
Số lượng ct ca Row hin ti  
Kiu dliu ca Col  
Kiu ca Object trong .NET Framework  
Tên ca Column hin ti  
FieldCount – ĐT  
GetDataTypeName PT  
GetFieldType PT  
GetName PT  
Trvindex của Column tương ứng vi tên  
Column Metadata  
Kim tra data reader có row hay không ?  
Số lượng Rows bị thay đổi, chèn thêm, xóa  
GetOrdinal - PT  
GetSchemaTable PT  
HasRows – ĐT  
RecordsAffected - ĐT  
Xlý nhiu result sets vi mt data reader  
dgi mt lúc nhiu query và mt data reader thì vic xlý dliệu thu được dường như phức tp  
nhưng .NET có cung cấp một phương thức để làm vic với thao tác này „NextResult()‟  
dụ dưới đây minh họa thao tác xlý nhiu result sets vi mt reader  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
using System.Xml;  
public class DataReader  
{
public static void Main()  
{
// To connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// To query  
string sql1 = @"SELECT productname, unitprice FROM products ";  
string sql2 = @"SELECT firstname, lastname FROm employees ";  
string sql = sql1 + sql2;  
try  
{
// Mkết ni  
conn.Open();  
// To command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// To Data Reader  
SqlDataReader reader = cmd.ExecuteReader();  
do  
{
Page 8 of 9  
Cách sdng Data Readers  
Author : Xcross87  
2007  
while (reader.Read())  
{
Console.WriteLine("\t{0} - {1}", reader[0], reader[1]);  
}
Console.WriteLine("".PadLeft(60,'='));  
} while (reader.NextResult());  
reader.Close();  
}
catch (SqlException sqle)  
{
// Thông báo li  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết ni  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Ở đây có 2 query và từng query đưc xlần lượt. Chú ý các query phi có mt kí tự ngăn cách để kim  
tra hp lệ, trong SQL Server thì đơn giản chcn mt dấu cách (space) là được.  
Kết thúc vsdng Data Readers.  
Page 9 of 9  
pdf 9 trang myanh 11220
Bạn đang xem tài liệu "Cách sử dụng Data Readers", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfcach_su_dung_data_readers.pdf