Cách sử dụng Data Readers

Cách sử dụng Data Readers  
Author : Xcross87  
2007  
Ở bài trước mình đã giới thiệu về cách viết SQL statement và thực thi (execute) câu lệnh. Ở bài này mình  
sẽ tóm tắt về các sử dụng Data Readers.  
Data Readers được dùng để :  
Thu nhận kết quả từ các query  
Lấy thông tin về các cột các hàng trong bảng dữ liệu  
Lấy thông tin result set  
Lấy thông tin về schema  
Xử lý các result sets  
Tổng quát về Data Readers (Data Readers in General)  
Thành phần thứ ba của nhà cung cấp dữ liệu là „data reader‟, 2 thành phần trước là „connection‟ và  
„command‟. Một khi đã tạo được kết nối tới cơ sở dữ liệu và thi hành các lệnh query thì chúng ta cần một  
phương thức nào đó để hỗ trợ cách xử lý dữ liệu thu nhận được. Nếu bạn đã biết về ADO thì một  
ADO.NET data reader giống như là ADO recordset một chiều phía client, chứ không phải là một đối  
tượng COM.  
Data readers là các đối tượng được cung cấp trong lớp interface „System.Data.IdataReader‟. Một „data  
reader‟ có thể gọi là một stream đã kết nối tới cơ sở dữ liệu đọc dữ liệu hiệu quả, theo một chiều và thu  
nhận dữ liệu theo từng dòng (row).Vì vậy không thể trực tiếp xử lý data reader mà phải xử lý thông qua  
phương thức „ExecuteReader‟ của một đối tượng command. Ví 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 họa cách tạo một đối tượng trong lớp SqlDataReader.  
Chú ý: Quy tắc chung khi sử dụng data reader dơn giản là chỉ thu nhận và trình bày kết quả thu  
được.Phân biệt data reader với dataset, cả 2 đều được tạo ra với mục đích khác nhau mặc dù cách nhìn  
nhận chung thì đều thu nhận kết quả.  
Thử một vài ví dụ làm việc với Data Reader  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
public class ThiHanhMenhLenh  
{
Page 1 of 9  
Cách sử dụng Data Readers  
Author : Xcross87  
2007  
public static void Main()  
{
// Tạo connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// Tạo query  
string sql = @"SELECT contactname FROM customers";  
try  
{
// Mở kết nối  
conn.Open();  
// Tạo command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// Tạo Data Reader  
SqlDataReader reader = cmd.ExecuteReader();  
while (reader.Read())  
{
Console.WriteLine(" {0} ", reader[0]);  
}
reader.Close();  
}
catch (SqlException sqle)  
{
// Thông báo lỗi  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết nối  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Trong vòng lặp thu kết quả của „data reader‟ (reader) phương thức „Read()‟ trỏ đến giá trị hàng tiếp theo  
(nếu có) . Bản chất khi reader đã có kết quả sau khi thực thi query thì reader nắm giữ toàn bộ record thu  
được. vì vậy có thể dùng index để gọi đến một giá trị bất kì trong kết quả thu được nằm trong giới hạn của  
bound.  
Cuối cùng thì phải đóng lại reader. Tại sao đóng ? Vì khi đã kết nối và reader được gắn vào kết nối thì  
reader sẽ nằm ở đó để lấy dữ liệu khi xử lý. Cứ tưởng tượng một 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 nữa mà muốn ra cũng không được. Tương tự như vậy,  
phải đóng lại reader sau mỗi lần đọc.  
Ví dụ dưới đây minh họa cách sử dụng index gọi giá trị column khi Read()  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
Page 2 of 9  
Cách sử dụng Data Readers  
Author : Xcross87  
2007  
public class ThiHanhMenhLenh  
{
public static void Main()  
{
// Tạo connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// Tạo query  
string sql = @"SELECT companyname,contactname FROM customers WHERE  
contactname LIKE 'M%'";  
try  
{
// Mở kết nối  
conn.Open();  
// Tạo 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));  
// Tạo 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 lỗi  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết nối  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Kết quả thu được trong reader thu về là kiểu object . Vì vậy ở trên mình convert các object sang kiểu  
string (ToString()) sau đó căn lề. Cuối cùng đóng kết nối để giải phóng khỏi kết nối.  
Nhiều lúc cũng chẳng biết là cột số mấy vị trí nào hơi phức tạp. Lớp SqlDataReader cung cấp cho đối  
tượng cách chỉ định index bằng tên cột.  
[code]  
Page 3 of 9  
Cách sử dụng 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 cập vào bảng dữ liệu kết quả thu được giữ tạm thời  
theo kiểu của .NET chứ không phải kiểu ban đầu trong tài nguyên. Hai cách ở trên mỗi lần lấy một kết  
quả đều kiểm tra xem dữ liệu kiểu gì và convert kiểu nên không tối ưu.  
Do đó phương thức lấy dữ liệu theo kiểu được cung cấp , tất cả bắt đầu với „Get‟  
Dưới đây là 2 bảng dữ liệu tương ứng các kiểu dữ liệu trong SQLServer và OLE DB với .NET  
Bảng 1 : Kiểu dữ liệu trong SQL Server và .NET  
SQL Server  
.NET  
Phương thức truy cập  
GetInt64  
Int64  
Bigint  
Binary  
Bit  
Byte[]  
Boolean  
GetBytes  
GetBoolean  
String hoặc Char[]  
DateTime  
Decimal  
GetString hoặc GetChars  
GetDateTime  
GetDecimal  
Char  
Datetime  
Decimal  
Float  
Double  
GetDouble  
Byte[]  
Int32  
GetBytes  
GetInt32  
Image hoặc long varbinary  
Int  
Decimal  
GetDecimal  
Money  
String hoặc Char[]  
String hoặc Char[]  
Decimal  
GetString hoặc GetChars  
GetString hoặc GetChars  
GetDecimal  
Nchar  
Ntext  
Numeric  
String hoặc Char[]  
Single  
GetString hoặc GetChars  
GetFloat  
Nvarchar  
Real  
DateTime  
Inte16  
GetDateTime  
GetInt16  
Smalldatetime  
Smallint  
Decimal  
Object  
String hoặc Char[]  
Byte[]  
Byte  
GetDecimal  
GetValue  
GetString hoặc GetChars  
GetBytes  
GetByte  
Smallmoney  
Sql_variant  
Long varchar  
Timestamp  
Tinyint  
Guid  
Byte[]  
String hoặc Char[]  
GetGuid  
GetBytes  
GetString hoặc GetChars  
Uniqueidentifier  
Varbinary  
Varchar  
Bảng 2 : Kiểu dữ liệu trong OLE DB và .NET  
Page 4 of 9  
Cách sử dụng Data Readers  
Author : Xcross87  
2007  
OLE DB  
DBTYPE_I8  
.NET  
Phương thức truy cập  
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  
Ví dụ bảng Products trong Northwind  
Tên cột  
ProductID (unique)  
ProductName  
SupplierID  
CategoryID  
QuantityPerUnit  
UnitPrice  
Kiểu dữ liệu  
Độ 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 họa cách sử dụng phương thức truy cập theo kiểu dữ liệu :  
Page 5 of 9  
Cách sử dụng Data Readers  
Author : Xcross87  
2007  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
public class ThiHanhMenhLenh  
{
public static void Main()  
{
// Tạo connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// Tạo query  
string sql = @"SELECT productname, unitprice, unitsinstock,  
discontinued FROM products";  
try  
{
// Mở kết nối  
conn.Open();  
// Tạo command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// Tạo 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 lỗi  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết nối  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Lấy thông tin về Data  
Ví dụ dưới đây lấy thông tin về schema của bảng :  
Page 6 of 9  
Cách sử dụng 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()  
{
// Tạo connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// Tạo query  
string sql = @"SELECT productname, unitprice, unitsinstock,  
discontinued FROM products";  
try  
{
// Mở kết nối  
conn.Open();  
// Tạo command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// Tạo 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 lỗi  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết nối  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Page 7 of 9  
Cách sử dụng Data Readers  
Author : Xcross87  
2007  
Ở đây dùng „GetSchemaTable‟ để lấy về thông tin Schema, như tên gọi thì kết quả trả về kiểu DataTable.  
Vì vậy ta phải xử lý DataTable bằng DataRow và DataColumn.  
Bảng dưới đây là các method được cung cấp để lấy thông tin về dữ liệu  
Phương thức hoặc Đặc tính  
Depth – ĐT  
Chú thích  
Lấy độ sâu của Row hiện tại  
Số lượng cột của Row hiện tại  
Kiểu dữ liệu của Col  
Kiểu của Object trong .NET Framework  
Tên của Column hiện tại  
FieldCount – ĐT  
GetDataTypeName – PT  
GetFieldType – PT  
GetName – PT  
Trả về index của Column tương ứng với tên  
Column Metadata  
Kiểm 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  
Xử lý nhiều result sets với một data reader  
Ví dụ gọi một lúc nhiều query và một data reader thì việc xử lý dữ liệu thu được dường như phức tạp  
nhưng .NET có cung cấp một phương thức để làm việc với thao tác này „NextResult()‟  
Ví dụ dưới đây minh họa thao tác xử lý nhiều result sets với một reader  
[code]  
using System;  
using System.Data;  
using System.Data.SqlClient;  
using System.Xml;  
public class DataReader  
{
public static void Main()  
{
// Tạo connection  
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;  
Integrated Security = True;  
Database = Northwind");  
// Tạo query  
string sql1 = @"SELECT productname, unitprice FROM products ";  
string sql2 = @"SELECT firstname, lastname FROm employees ";  
string sql = sql1 + sql2;  
try  
{
// Mở kết nối  
conn.Open();  
// Tạo command  
SqlCommand cmd = new SqlCommand(sql, conn);  
// Tạo Data Reader  
SqlDataReader reader = cmd.ExecuteReader();  
do  
{
Page 8 of 9  
Cách sử dụng 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 lỗi  
Console.WriteLine(sqle.ToString());  
}
finally  
{
// Đóng kết nối  
conn.Close();  
Console.WriteLine("Close connection !");  
}
}
}
[/code]  
Ở đây có 2 query và từng query được xử lý lần lượt. Chú ý các query phải có một kí tự ngăn cách để kiểm  
tra hợp lệ, trong SQL Server thì đơn giản chỉ cần một dấu cách (space) là được.  
Kết thúc về sử dụng Data Readers.  
Page 9 of 9  
pdf 9 trang myanh 30820 Free
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