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.

Trong khi dataReader đang mở các thao tác dữ liệu trên nguồn dữ liệu đều không thể thao tác cho đến khi dataReader đóng lại bằng lệnh Close 

 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.