Ngôn ngữ ASP.NET - Đối tượng DataReader
Giới thiệu đối tượng DataReader
Một DataReader là đối tượng phù hợp để đọc dữ liệu một cách hiệu quả nhất. Như tên gọi, bạn không thể dùng nó để ghi dữ liệu. DataReader thường được mô tả là luồng dữ liệu fast-forward firehose-like (fire-hose: ống vòi rồng).
Bạn có thể đọc dữ liệu từ đối tượng DataReader theo hướng forward-only trong một thứ tự nhất định. Mỗi lần đọc một vài dữ liệu, bạn phải lưu nó nếu cần thiết bởi vì bạn không thể quay trở lại và đọc nó một lần nữa.
Kiểu thiết kế forward-only của DataReader để giúp nó hoạt động nhanh. Nó không thể di chuyển trực tiếp đến các dòng dữ liệu ở vị trí bất kì và không thể ghi vào dữ liệu nguồn. Do đó, nếu bạn chỉ yêu cầu đọc một nhóm dữ liệu một lần và cần phương pháp nhanh nhất, DataReader là lựa chọn tốt nhất.
Tùy theo loại Connection mà DataReader thuộc tên miền:
- System.Data.OleDb.OleDbDataReade
- System.Data.SqlClient.SqlDataReader
Tạo một đối tượng SqlDataReader
Có một chút khác biệt để lấy được một thể hiện của SqlDataReader so với các đối tượng ADO.NET khác. Bạn phải gọi phương thức ExecuteReader() của một đối tượng SqlCommand:
SqlDataReader rdr = cmd.ExecuteReader();
Các thuộc tính
- FieldCout: Số Connectionột trên dòng hiện hành của DataReader
- IsClosed : Cho biết dataReader đã đóng
- Item:Trị của cột truyền vào. Tham số truyền vào là tên cột hoặc stt từ 0.
Các phương thức
- Close(): Đóng DataReader
- GetFieldType(): Trả về kiểu dữ liệu của cột truyền vào.
- GetName(): Trả về tên của cột truyền vào
- GetValue(): Trả về trị của cột truyền vào
- Read() : Di chuyển đến dòng kế tiếp và trả về true nếu còn dòng để di chuyển, ngược lại trả về False.
Ví dụ: dùng SqlDataReader để truy xuất dữ liệu:
try
{
SqlConnection cnn = new SqlConnection("Data Source=(local);Initial Catalog=QLbansach;User ID=sa;Password=");
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "SELECT * FROM Nhaxuatban";
cmd.CommandType = CommandType.Text;
cnn.Open();
SqlDataReader dr = cmd.ExecuteReader();
String list = "";
while (dr.Read())
{
list = list + dr["TenNXB"].ToString().Trim() + " ";
}
dr.Close();
response.write(list.ToString());
cnn.Close();
}
catch (Exception)
{
response.write(“Thất bại!“);
}
Ví dụ : SqlDataReader gọi procedure Getnhaxuatban
try
{
SqlConnection cnn = new SqlConnection("Data Source=(local);Initial Ctalog=QLbansach;User ID=sa;Password=");
SqlCommand cmd = new SqlCommand("GetchudeByMaCD", cnn);
cmd.Connection = cnn;
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parMALINHVUC =new SqlParameter("@Machude", SqlDbType.NChar, 10);
parMAVHUDE.Value = TextBox1.Text;
cmd.Parameters.Add(parMACHUDE);
cnn.Open();
IDataReader dr = cmd.ExecuteReader();
String list = "";
while (dr.Read())
{
list = list + dr["Tenchude"].ToString();
}
dr.Close();
response.write(list.ToString());
cnn.Close();
}
catch (Exception)
{
response.write(“Thất bại!“);
}
Code procedure Getnhaxuatban:
Create Procedure GetchudeByMaCD
@Machude char(15)
AS
Begin
Select * From Chude Where MaCD=@Machude
End
Bổ sung: Tuy nhiên thay vì sử dụng indexer của SqlDataReader, bạn có thể dùng các phương thức GetXXX() với XXX là kiểu dữ liệu bạn muốn lấy. Tùy vào tên phương thức mà kiểu trả về sẽ tương ứng với nó. Ví dụ cột đầu tiên của bảng là string, bạn có thể gọi như sau:
string value = rdr.GetString(0);
Tuy nhiên như bạn thấy, tham số của nó là kiểu int, một số chỉ vị trí của cột tính từ 0.
Bạn có thể xem chi tiết hơn tại: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx.
Tổng kết
Đối tượng DataReader cho phép bạn đọc nhanh dữ liệu theo cách forward-only. Bạn lấy dữ liệu bằng cách đọc từng dòng từ luồng dữ liệu. Gọi phương thức Close() của DataReader để đảm bảo sẽ không có tài nguyên nào thất thoát.