分类: .Net编程类 |
SqlCommand类设计用于帮助开发人员构造自己的查询。如本章前文所述,调用SqlCommand对象的ExecuteReader方法会返回SqlDataReader对象,可以用它来获取由这些查询返回的行。
SqlDataReader类与.NET Framework中的其他读取器类相似,例如XmlReader,TextReader和StreamReader类。这些类中的每一种都提供一种有效的轻型对象,可以利用它们(以只读方式)查看对象所公开的数据。例如,TextReader拥有允许读取文本文件内容的方法,每次阅读一行。与此类似,SqlDataReader公开了允许在查询结果中进行遍历的属性和方法。
曾经使用过远程数据对象(RDO)和活动数据对象 (ADO)或低级开放式数据库连接(ODBC)以及OLE DB API的开发人员可能对“流水游标”这一术语比较熟悉。数据库使用这一机制尽可能快速地返回查询的结果。流水游标通过放弃一些功能来换取性能。在从结果集中读取一行并移动到下一行之后,前一行将不再可用。结果出现的速度非常快,就像来自水龙带中的水一样,流水游标就是因此而得名。ADO.NET SqlDataReader允许直接访问流水游标。要创建一个SqlDataReader,只需要调用SqlCommand对象的 ExecuteReader方法。
以下代码段说明如何使用SqlDataReader查看一个简单查询的结果。
string strConn, strSQL;
strConn = @"Data Source=.\SQLExpress;" +
strSQL = "SELECT CustomerID, CompanyName FROM Customers";
SqlConnection cn = new SqlConnection(strConn);
cn.Open();
SqlCommand cmd = new SqlCommand(strSQL, cn);
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
rdr.Close();
注意,因为第一数据行在调用 ExecuteReader之后并非立即可用,所以该代码在读取结果的第一行之前调用Read方法。这代表相对于以前对象模型(例如ADO)的一个变化。在调用Read方法之前,SqlCommand对象返回的SqlDataReader并不能使第一数据行可用。
在第一次调用Read方法时,SqlDataReader移到结果集中的第一行。对Read方法的后续调用移动到下一行。此方法还返回一个Boolean值,以指示 SqlDataReader是否有另一可用行。因此,如果Read返回True,则SqlDataReader移动到下一可用行。当Read方法返回 False时,表明已经到达结果的末尾。
当存在可用数据行时,只需要调用SqlDataReader的索引器,并传递列的名称。SqlDataReader使用一般Object数据类型返回列的内容。尽管这并不是获取数据的最有效方式,但它可以作为一个简单的开始。
string strConn, strSQL;
strConn = @"Data Source=.\SQLExpress;" +
strSQL = "SELECT CustomerID, CompanyName FROM Customers";
using (SqlConnection cn = new SqlConnection(strConn)) {
} catch (SqlException ex) {
}
using (SqlCommand cmd = new SqlCommand(strSQL, cn)) {
}
在编写代码时,您可能不知道结果集的架构。例如,创建一个由用户定义查询的专用查询工具,或者使用SELECT *FROM查询,数据库管理员可能已经向正在查询的表中添加了更多列。
无论是哪一种原因,如果您事先不知道结果集的架构,则可以利用SqlDataReader对象的各种方法来确定结果集的架构。
SqlDataReader类提供一个FieldCount属性,可以用来确定查询返回了多少个字段。请切记,一些查询(UPDATE,CREATE TABLE等)不返回任何字段。
在SqlDataReader中没有指示可用行的属性。SqlDataReader代表一个数据流,因为SqlDataReader事先不知道查询将会返回多少行。
如果需要确定一个字段的名称,请调用SqlDataReader的GetName方法。此方法接受一个整数,指定字段的序号,并在一个字符串中返回其名称。
要确定用于存储一特定字段内容的.NET数据类型,请调用SqlDataReader的GetFieldType方法。与GetName方法类似,GetFieldType接受一个整数,指定字段的序号。GetFieldType方法在一个Type对象中返回其数据类型。
如果需要确定一个字段的数据库数据类型,请调用SqlDataReader类的GetDataTypeName方法。此方法接受字段的序号(一个整数),并返回一个字符串,其中有该字段在数据库中的数据类型名称。
以下代码段使用重载的ExecuteReader方法来返回架构,但不返回行,因此,它使用了GetName,GetFieldType和GetDataTypeName方法,以显示有关结果集架构的信息。
string strConn, strSQL;
strConn = @"Data Source=.\SQLExpress;" +
strSQL = "SELECT OrderID, CustomerID, OrderDate, Freight " +
SqlConnection cn = new SqlConnection(strConn);
cn.Open();
SqlCommand cmd = new SqlCommand(strSQL, cn);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SchemaOnly);
for (int intField = 0; intField < rdr.FieldCount; intField++)
{
}
rdr.Close();
如果知道待访问字段的名称,但不知道此字段的序号,可使用SqlDataReader的GetOrdinal方法。此方法接受一个表示字段名称的字符串,并返回该列的序号。
联系客服