Tải bản đầy đủ (.pdf) (9 trang)

Cachsudungdatareader 130806045252 phpapp01

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (350.75 KB, 9 trang )

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ữ tồ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
Bigint

Binary
Bit
Char
Datetime
Decimal
Float
Image hoặc long varbinary
Int
Money
Nchar
Ntext
Numeric
Nvarchar
Real
Smalldatetime
Smallint
Smallmoney
Sql_variant
Long varchar
Timestamp
Tinyint
Uniqueidentifier
Varbinary
Varchar

.NET
Int64
Byte[]
Boolean
String hoặc Char[]

DateTime
Decimal
Double
Byte[]
Int32
Decimal
String hoặc Char[]
String hoặc Char[]
Decimal
String hoặc Char[]
Single
DateTime
Inte16
Decimal
Object
String hoặc Char[]
Byte[]
Byte
Guid
Byte[]
String hoặc Char[]

Bảng 2 : Kiểu dữ liệu trong OLE DB và .NET

Page 4 of 9

Phương thức truy cập
GetInt64
GetBytes
GetBoolean

GetString hoặc GetChars
GetDateTime
GetDecimal
GetDouble
GetBytes
GetInt32
GetDecimal
GetString hoặc GetChars
GetString hoặc GetChars
GetDecimal
GetString hoặc GetChars
GetFloat
GetDateTime
GetInt16
GetDecimal
GetValue
GetString hoặc GetChars
GetBytes
GetByte
GetGuid
GetBytes
GetString hoặc GetChars


Cách sử dụng Data Readers
OLE DB
DBTYPE_I8
DBTYPE_BYTES
DBTYPE_BOOL
DBTYPE_BSTR

DBTYPE_STR
DBTYPE_CY
DBTYPE_DATE
DBTYPE_DBDATE
DBTYPE_DBTIME
DBTYPE_DBTIMESTAMP
DBTYPE_DECIMAL
DBTYPE_R8
DBTYPE_ERROR
DBTYPE_FILETIME
DBTYPE_GUID
DBTYPE_I4
DBTYPE_LONGVARCHAR
DBTYPE_NUMERIC
DBTYPE_R4
DBTYPE_I2
DBTYPE_I1
DBTYPE_UI8
DBTYPE_UI4
DBTYPE_UI2
DBTYPE_VARCHAR
DBTYPE_VARIANT
DBTYPE_NVARCHAR
DBTYPE_WSRT

Author : Xcross87

2007

Phương thức truy cập

GetInt64
GetBytes
GetBoolean
GetString
GetString
GetDecimal
GetDateTime
GetDateTime
GetDateTime
GetDateTime
GetDecimal
GetDouble
GetValue
GetDateTime
GetGuid
GetInt32
GetString
GetDecimal
GetFloat
GetInt16
GetByte
GetValue
GetValue
GetValue
GetString
GetValue
GetString
GetString

.NET

Int64
Byte[]
Boolean
String
String
Decimal
DateTime
DateTime
DateTime
DateTime
Decimal
Double
ExternalException
DateTime
Guid
Int32
String
Decimal
Single
Int16
Byte
Uint64
Uint32
Uint16
String
Object
String
String

Ví dụ bảng Products trong Northwind

Tên cột
ProductID (unique)
ProductName
SupplierID
CategoryID
QuantityPerUnit
UnitPrice
UnitInStock
UnitsOnOrder
ReorderLevel
Discontinued

Kiểu dữ liệu
Int
Nvarchar
Int
Int
Nvarchar
Money
Smallint
Smallint
Smallint
Bit

Độ dài
4
40
4
4
20

8
2
2
2
1

Cho phép NULLS?
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
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 :
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
FieldCount – ĐT
GetDataTypeName – PT
GetFieldType – PT
GetName – PT
GetOrdinal - PT
GetSchemaTable – PT
HasRows – ĐT
RecordsAffected - Đ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
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

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



×