SlideShare a Scribd company logo
1 of 9
Cách sử dụng Data Readers Author : Xcross87 2007
Page 1 of 9
Ở 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
{
Cách sử dụng Data Readers Author : Xcross87 2007
Page 2 of 9
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;
Cách sử dụng Data Readers Author : Xcross87 2007
Page 3 of 9
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]
Cách sử dụng Data Readers Author : Xcross87 2007
Page 4 of 9
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
Bigint Int64 GetInt64
Binary Byte[] GetBytes
Bit Boolean GetBoolean
Char String hoặc Char[] GetString hoặc GetChars
Datetime DateTime GetDateTime
Decimal Decimal GetDecimal
Float Double GetDouble
Image hoặc long varbinary Byte[] GetBytes
Int Int32 GetInt32
Money Decimal GetDecimal
Nchar String hoặc Char[] GetString hoặc GetChars
Ntext String hoặc Char[] GetString hoặc GetChars
Numeric Decimal GetDecimal
Nvarchar String hoặc Char[] GetString hoặc GetChars
Real Single GetFloat
Smalldatetime DateTime GetDateTime
Smallint Inte16 GetInt16
Smallmoney Decimal GetDecimal
Sql_variant Object GetValue
Long varchar String hoặc Char[] GetString hoặc GetChars
Timestamp Byte[] GetBytes
Tinyint Byte GetByte
Uniqueidentifier Guid GetGuid
Varbinary Byte[] GetBytes
Varchar String hoặc Char[] GetString hoặc GetChars
Bảng 2 : Kiểu dữ liệu trong OLE DB và .NET
Cách sử dụng Data Readers Author : Xcross87 2007
Page 5 of 9
OLE DB .NET Phương thức truy cập
DBTYPE_I8 Int64 GetInt64
DBTYPE_BYTES Byte[] GetBytes
DBTYPE_BOOL Boolean GetBoolean
DBTYPE_BSTR String GetString
DBTYPE_STR String GetString
DBTYPE_CY Decimal GetDecimal
DBTYPE_DATE DateTime GetDateTime
DBTYPE_DBDATE DateTime GetDateTime
DBTYPE_DBTIME DateTime GetDateTime
DBTYPE_DBTIMESTAMP DateTime GetDateTime
DBTYPE_DECIMAL Decimal GetDecimal
DBTYPE_R8 Double GetDouble
DBTYPE_ERROR ExternalException GetValue
DBTYPE_FILETIME DateTime GetDateTime
DBTYPE_GUID Guid GetGuid
DBTYPE_I4 Int32 GetInt32
DBTYPE_LONGVARCHAR String GetString
DBTYPE_NUMERIC Decimal GetDecimal
DBTYPE_R4 Single GetFloat
DBTYPE_I2 Int16 GetInt16
DBTYPE_I1 Byte GetByte
DBTYPE_UI8 Uint64 GetValue
DBTYPE_UI4 Uint32 GetValue
DBTYPE_UI2 Uint16 GetValue
DBTYPE_VARCHAR String GetString
DBTYPE_VARIANT Object GetValue
DBTYPE_NVARCHAR String GetString
DBTYPE_WSRT String GetString
Ví dụ bảng Products trong Northwind
Tên cột Kiểu dữ liệu Độ dài Cho phép NULLS?
ProductID (unique) Int 4 No
ProductName Nvarchar 40 No
SupplierID Int 4 Yes
CategoryID Int 4 Yes
QuantityPerUnit Nvarchar 20 Yes
UnitPrice Money 8 Yes
UnitInStock Smallint 2 Yes
UnitsOnOrder Smallint 2 Yes
ReorderLevel Smallint 2 Yes
Discontinued Bit 1 No
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 :
Cách sử dụng Data Readers Author : Xcross87 2007
Page 6 of 9
[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}tt{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 :
Cách sử dụng Data Readers Author : Xcross87 2007
Page 7 of 9
[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]
Cách sử dụng Data Readers Author : Xcross87 2007
Page 8 of 9
Ở đâ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 Chú thích
Depth – ĐT Lấy độ sâu của Row hiện tại
FieldCount – ĐT Số lượng cột của Row hiện tại
GetDataTypeName – PT Kiểu dữ liệu của Col
GetFieldType – PT Kiểu của Object trong .NET Framework
GetName – PT Tên của Column hiện tại
GetOrdinal - PT Trả về index của Column tương ứng với tên
GetSchemaTable – PT Column Metadata
HasRows – ĐT Kiểm tra data reader có row hay không ?
RecordsAffected - ĐT Số lượng Rows bị thay đổi, chèn thêm, xóa
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
{
Cách sử dụng Data Readers Author : Xcross87 2007
Page 9 of 9
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.

More Related Content

What's hot

Android Nâng cao-Bài 8-JSON & XML Parsing
Android Nâng cao-Bài 8-JSON & XML ParsingAndroid Nâng cao-Bài 8-JSON & XML Parsing
Android Nâng cao-Bài 8-JSON & XML ParsingPhuoc Nguyen
 
Them,xoa,sua data trong xml
Them,xoa,sua data trong xmlThem,xoa,sua data trong xml
Them,xoa,sua data trong xmlNguyễn Linh
 
Thuc thi menh lenh voi co so du lieu
Thuc thi menh lenh voi co so du lieuThuc thi menh lenh voi co so du lieu
Thuc thi menh lenh voi co so du lieutruong le hung
 
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...MasterCode.vn
 
Nhibernate -Co ban
Nhibernate -Co banNhibernate -Co ban
Nhibernate -Co ban07k1034
 
4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieuDao Uit
 
Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)
Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)
Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)Hoa Le
 
Lap trinhcosodulieuvoi c-sharp_phan-2
Lap trinhcosodulieuvoi c-sharp_phan-2Lap trinhcosodulieuvoi c-sharp_phan-2
Lap trinhcosodulieuvoi c-sharp_phan-2Hiển Phùng
 
Hdth08 ltudql02-linq
Hdth08 ltudql02-linqHdth08 ltudql02-linq
Hdth08 ltudql02-linqDũng Đinh
 
Semina Kết nối nguồn dữ liệu từ Internet
Semina Kết nối nguồn dữ liệu từ Internet Semina Kết nối nguồn dữ liệu từ Internet
Semina Kết nối nguồn dữ liệu từ Internet Nguyễn Ngọc Hoàng
 
03 chuong 3 - data sets
03   chuong 3 - data sets03   chuong 3 - data sets
03 chuong 3 - data setstruong le hung
 
Hdth07 ltudql02-linq-ep1
Hdth07 ltudql02-linq-ep1Hdth07 ltudql02-linq-ep1
Hdth07 ltudql02-linq-ep1Dũng Đinh
 

What's hot (20)

Zend db
Zend dbZend db
Zend db
 
Android Nâng cao-Bài 8-JSON & XML Parsing
Android Nâng cao-Bài 8-JSON & XML ParsingAndroid Nâng cao-Bài 8-JSON & XML Parsing
Android Nâng cao-Bài 8-JSON & XML Parsing
 
ado.net
ado.netado.net
ado.net
 
Them,xoa,sua data trong xml
Them,xoa,sua data trong xmlThem,xoa,sua data trong xml
Them,xoa,sua data trong xml
 
Tổng hợp nè
Tổng hợp nèTổng hợp nè
Tổng hợp nè
 
Ung dung web chuong 6
Ung dung web  chuong 6Ung dung web  chuong 6
Ung dung web chuong 6
 
Thuc thi menh lenh voi co so du lieu
Thuc thi menh lenh voi co so du lieuThuc thi menh lenh voi co so du lieu
Thuc thi menh lenh voi co so du lieu
 
Bài 6: Working with DATA
Bài 6: Working with DATABài 6: Working with DATA
Bài 6: Working with DATA
 
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
 
Nhibernate -Co ban
Nhibernate -Co banNhibernate -Co ban
Nhibernate -Co ban
 
4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu
 
Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)
Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)
Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)
 
Data storage Android
Data storage AndroidData storage Android
Data storage Android
 
Data provider
Data providerData provider
Data provider
 
Lap trinhcosodulieuvoi c-sharp_phan-2
Lap trinhcosodulieuvoi c-sharp_phan-2Lap trinhcosodulieuvoi c-sharp_phan-2
Lap trinhcosodulieuvoi c-sharp_phan-2
 
Hdth08 ltudql02-linq
Hdth08 ltudql02-linqHdth08 ltudql02-linq
Hdth08 ltudql02-linq
 
Semina Kết nối nguồn dữ liệu từ Internet
Semina Kết nối nguồn dữ liệu từ Internet Semina Kết nối nguồn dữ liệu từ Internet
Semina Kết nối nguồn dữ liệu từ Internet
 
03 chuong 3 - data sets
03   chuong 3 - data sets03   chuong 3 - data sets
03 chuong 3 - data sets
 
Linq2 sql
Linq2 sqlLinq2 sql
Linq2 sql
 
Hdth07 ltudql02-linq-ep1
Hdth07 ltudql02-linq-ep1Hdth07 ltudql02-linq-ep1
Hdth07 ltudql02-linq-ep1
 

Similar to Cach su dung data reader

2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#Dao Uit
 
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theoMasterCode.vn
 
3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#Dao Uit
 
Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1Hiển Phùng
 
Trong bài viết hôm nay
Trong bài viết hôm nayTrong bài viết hôm nay
Trong bài viết hôm nayledoanduc
 
Tao mot ket noi toi co so du lieu dung c#
Tao mot ket noi toi co so du lieu dung c#Tao mot ket noi toi co so du lieu dung c#
Tao mot ket noi toi co so du lieu dung c#truong le hung
 
Lớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaLớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaANHMATTROI
 
S vnet.vn 51. [silde bài giảng] lập trình trên môi trường windows với ado.net...
S vnet.vn 51. [silde bài giảng] lập trình trên môi trường windows với ado.net...S vnet.vn 51. [silde bài giảng] lập trình trên môi trường windows với ado.net...
S vnet.vn 51. [silde bài giảng] lập trình trên môi trường windows với ado.net...zzsunzz
 
7.databinding
7.databinding7.databinding
7.databindingDao Uit
 
Bài 5: ADO.NET & Kiến trúc không kết nối (tiếp) Điều khiển DataGridView,Combo...
Bài 5: ADO.NET & Kiến trúc không kết nối (tiếp) Điều khiển DataGridView,Combo...Bài 5: ADO.NET & Kiến trúc không kết nối (tiếp) Điều khiển DataGridView,Combo...
Bài 5: ADO.NET & Kiến trúc không kết nối (tiếp) Điều khiển DataGridView,Combo...MasterCode.vn
 
Chuong 07_ gắng kết dữ liệu asp.net
Chuong 07_ gắng kết dữ liệu asp.netChuong 07_ gắng kết dữ liệu asp.net
Chuong 07_ gắng kết dữ liệu asp.netThuyNguyenThi25
 

Similar to Cach su dung data reader (20)

2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
 
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
 
3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#
 
Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1
 
Trong bài viết hôm nay
Trong bài viết hôm nayTrong bài viết hôm nay
Trong bài viết hôm nay
 
C# co ban 10
C# co ban 10C# co ban 10
C# co ban 10
 
Tao mot ket noi toi co so du lieu dung c#
Tao mot ket noi toi co so du lieu dung c#Tao mot ket noi toi co so du lieu dung c#
Tao mot ket noi toi co so du lieu dung c#
 
LinQ
LinQLinQ
LinQ
 
Lớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaLớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong java
 
access
accessaccess
access
 
S vnet.vn 51. [silde bài giảng] lập trình trên môi trường windows với ado.net...
S vnet.vn 51. [silde bài giảng] lập trình trên môi trường windows với ado.net...S vnet.vn 51. [silde bài giảng] lập trình trên môi trường windows với ado.net...
S vnet.vn 51. [silde bài giảng] lập trình trên môi trường windows với ado.net...
 
7.databinding
7.databinding7.databinding
7.databinding
 
Asp control
Asp controlAsp control
Asp control
 
Ung dung web chuong 7
Ung dung web  chuong 7Ung dung web  chuong 7
Ung dung web chuong 7
 
SQL injection
SQL injectionSQL injection
SQL injection
 
Bài 5: ADO.NET & Kiến trúc không kết nối (tiếp) Điều khiển DataGridView,Combo...
Bài 5: ADO.NET & Kiến trúc không kết nối (tiếp) Điều khiển DataGridView,Combo...Bài 5: ADO.NET & Kiến trúc không kết nối (tiếp) Điều khiển DataGridView,Combo...
Bài 5: ADO.NET & Kiến trúc không kết nối (tiếp) Điều khiển DataGridView,Combo...
 
Bai1.pdf
Bai1.pdfBai1.pdf
Bai1.pdf
 
Aspnet 3.5 _05
Aspnet 3.5 _05Aspnet 3.5 _05
Aspnet 3.5 _05
 
C5. Model, DataSharing.pdf
C5. Model, DataSharing.pdfC5. Model, DataSharing.pdf
C5. Model, DataSharing.pdf
 
Chuong 07_ gắng kết dữ liệu asp.net
Chuong 07_ gắng kết dữ liệu asp.netChuong 07_ gắng kết dữ liệu asp.net
Chuong 07_ gắng kết dữ liệu asp.net
 

Cach su dung data reader

  • 1. Cách sử dụng Data Readers Author : Xcross87 2007 Page 1 of 9 Ở 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 {
  • 2. Cách sử dụng Data Readers Author : Xcross87 2007 Page 2 of 9 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;
  • 3. Cách sử dụng Data Readers Author : Xcross87 2007 Page 3 of 9 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]
  • 4. Cách sử dụng Data Readers Author : Xcross87 2007 Page 4 of 9 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 Bigint Int64 GetInt64 Binary Byte[] GetBytes Bit Boolean GetBoolean Char String hoặc Char[] GetString hoặc GetChars Datetime DateTime GetDateTime Decimal Decimal GetDecimal Float Double GetDouble Image hoặc long varbinary Byte[] GetBytes Int Int32 GetInt32 Money Decimal GetDecimal Nchar String hoặc Char[] GetString hoặc GetChars Ntext String hoặc Char[] GetString hoặc GetChars Numeric Decimal GetDecimal Nvarchar String hoặc Char[] GetString hoặc GetChars Real Single GetFloat Smalldatetime DateTime GetDateTime Smallint Inte16 GetInt16 Smallmoney Decimal GetDecimal Sql_variant Object GetValue Long varchar String hoặc Char[] GetString hoặc GetChars Timestamp Byte[] GetBytes Tinyint Byte GetByte Uniqueidentifier Guid GetGuid Varbinary Byte[] GetBytes Varchar String hoặc Char[] GetString hoặc GetChars Bảng 2 : Kiểu dữ liệu trong OLE DB và .NET
  • 5. Cách sử dụng Data Readers Author : Xcross87 2007 Page 5 of 9 OLE DB .NET Phương thức truy cập DBTYPE_I8 Int64 GetInt64 DBTYPE_BYTES Byte[] GetBytes DBTYPE_BOOL Boolean GetBoolean DBTYPE_BSTR String GetString DBTYPE_STR String GetString DBTYPE_CY Decimal GetDecimal DBTYPE_DATE DateTime GetDateTime DBTYPE_DBDATE DateTime GetDateTime DBTYPE_DBTIME DateTime GetDateTime DBTYPE_DBTIMESTAMP DateTime GetDateTime DBTYPE_DECIMAL Decimal GetDecimal DBTYPE_R8 Double GetDouble DBTYPE_ERROR ExternalException GetValue DBTYPE_FILETIME DateTime GetDateTime DBTYPE_GUID Guid GetGuid DBTYPE_I4 Int32 GetInt32 DBTYPE_LONGVARCHAR String GetString DBTYPE_NUMERIC Decimal GetDecimal DBTYPE_R4 Single GetFloat DBTYPE_I2 Int16 GetInt16 DBTYPE_I1 Byte GetByte DBTYPE_UI8 Uint64 GetValue DBTYPE_UI4 Uint32 GetValue DBTYPE_UI2 Uint16 GetValue DBTYPE_VARCHAR String GetString DBTYPE_VARIANT Object GetValue DBTYPE_NVARCHAR String GetString DBTYPE_WSRT String GetString Ví dụ bảng Products trong Northwind Tên cột Kiểu dữ liệu Độ dài Cho phép NULLS? ProductID (unique) Int 4 No ProductName Nvarchar 40 No SupplierID Int 4 Yes CategoryID Int 4 Yes QuantityPerUnit Nvarchar 20 Yes UnitPrice Money 8 Yes UnitInStock Smallint 2 Yes UnitsOnOrder Smallint 2 Yes ReorderLevel Smallint 2 Yes Discontinued Bit 1 No 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 :
  • 6. Cách sử dụng Data Readers Author : Xcross87 2007 Page 6 of 9 [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}tt{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 :
  • 7. Cách sử dụng Data Readers Author : Xcross87 2007 Page 7 of 9 [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]
  • 8. Cách sử dụng Data Readers Author : Xcross87 2007 Page 8 of 9 Ở đâ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 Chú thích Depth – ĐT Lấy độ sâu của Row hiện tại FieldCount – ĐT Số lượng cột của Row hiện tại GetDataTypeName – PT Kiểu dữ liệu của Col GetFieldType – PT Kiểu của Object trong .NET Framework GetName – PT Tên của Column hiện tại GetOrdinal - PT Trả về index của Column tương ứng với tên GetSchemaTable – PT Column Metadata HasRows – ĐT Kiểm tra data reader có row hay không ? RecordsAffected - ĐT Số lượng Rows bị thay đổi, chèn thêm, xóa 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 {
  • 9. Cách sử dụng Data Readers Author : Xcross87 2007 Page 9 of 9 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.