打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
.net使用SqlDataReader

net使用SqlDataReader

(2009-09-21 11:48:10)
分类: .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方法。

2.1  检查查询的结果

以下代码段说明如何使用SqlDataReader查看一个简单查询的结果。

string strConn, strSQL;

strConn = @"Data Source=.\SQLExpress;" +

             "Initial Catalog=Northwind;Trusted_Connection=Yes;";

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())

    Console.WriteLine("{0}: {1}",

                        rdr["CustomerID"], rdr["CompanyName"]);

rdr.Close();

注意,因为第一数据行在调用 ExecuteReader之后并非立即可用,所以该代码在读取结果的第一行之前调用Read方法。这代表相对于以前对象模型(例如ADO)的一个变化。在调用Read方法之前,SqlCommand对象返回的SqlDataReader并不能使第一数据行可用。

在第一次调用Read方法时,SqlDataReader移到结果集中的第一行。对Read方法的后续调用移动到下一行。此方法还返回一个Boolean值,以指示 SqlDataReader是否有另一可用行。因此,如果Read返回True,则SqlDataReader移动到下一可用行。当Read方法返回 False时,表明已经到达结果的末尾。

当存在可用数据行时,只需要调用SqlDataReader的索引器,并传递列的名称。SqlDataReader使用一般Object数据类型返回列的内容。尽管这并不是获取数据的最有效方式,但它可以作为一个简单的开始。

2.2  关闭SqlDataReader


string strConn, strSQL;

strConn = @"Data Source=.\SQLExpress;" +

             "Initial Catalog=Northwind;Integrated Security=True;";

strSQL = "SELECT CustomerID, CompanyName FROM Customers";

using (SqlConnection cn = new SqlConnection(strConn)) {

    try {

        cn.Open();

} catch (SqlException ex) {

    Console.WriteLine("Connect attempt failed");

    Console.WriteLine(" {0}", ex.Message);

}

using (SqlCommand cmd = new SqlCommand(strSQL, cn)) {

    try {

        using (SqlDataReader rdr = cmd.ExecuteReader()) {

            while (rdr.Read())

                Console.WriteLine(rdr["CompanyName"]);

            rdr.Close();

        }

    } catch (SqlException ex) {

        Console.WriteLine("Query failed");

        Console.WriteLine(" {0}", ex.Message);

    }

  }

  cn.Close();

}

2.3  查看结果集的架构

在编写代码时,您可能不知道结果集的架构。例如,创建一个由用户定义查询的专用查询工具,或者使用SELECT *FROM查询,数据库管理员可能已经向正在查询的表中添加了更多列。

无论是哪一种原因,如果您事先不知道结果集的架构,则可以利用SqlDataReader对象的各种方法来确定结果集的架构。

1. 确定可用字段的数目

SqlDataReader类提供一个FieldCount属性,可以用来确定查询返回了多少个字段。请切记,一些查询(UPDATE,CREATE TABLE等)不返回任何字段。

 注意    字段与列:关于ADO.NET的争论并没有在“如何对查询结果进行分类”这一问题上达到一致。SqlDataReader类在其方法和属性中使用术语“字段”,而DataTable则使用术语“列”。对我而言,这两种术语是可互换的。

2. 确定返回行的数目

在SqlDataReader中没有指示可用行的属性。SqlDataReader代表一个数据流,因为SqlDataReader事先不知道查询将会返回多少行。

3. 确定字段的名称

如果需要确定一个字段的名称,请调用SqlDataReader的GetName方法。此方法接受一个整数,指定字段的序号,并在一个字符串中返回其名称。

4. 确定字段的.NET数据类型

要确定用于存储一特定字段内容的.NET数据类型,请调用SqlDataReader的GetFieldType方法。与GetName方法类似,GetFieldType接受一个整数,指定字段的序号。GetFieldType方法在一个Type对象中返回其数据类型。

5. 确定字段的数据库数据类型

如果需要确定一个字段的数据库数据类型,请调用SqlDataReader类的GetDataTypeName方法。此方法接受字段的序号(一个整数),并返回一个字符串,其中有该字段在数据库中的数据类型名称。

以下代码段使用重载的ExecuteReader方法来返回架构,但不返回行,因此,它使用了GetName,GetFieldType和GetDataTypeName方法,以显示有关结果集架构的信息。

string strConn, strSQL;

strConn = @"Data Source=.\SQLExpress;" +

             "Initial Catalog=Northwind;Trusted_Connection=Yes;";

strSQL = "SELECT OrderID, CustomerID, OrderDate, Freight " +

          "FROM Orders";

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++)

{

    Console.WriteLine("Field #{0}", intField);

    Console.WriteLine(" Name: {0}", rdr.GetName(intField));

    Console.WriteLine(" .NET data type: {0}",

                         rdr.GetFieldType(intField).Name);

    Console.WriteLine(" Database data type: {0}",

                         rdr.GetDataTypeName(intField));

    Console.WriteLine();

}

rdr.Close();

6. 确定字段的序号

如果知道待访问字段的名称,但不知道此字段的序号,可使用SqlDataReader的GetOrdinal方法。此方法接受一个表示字段名称的字符串,并返回该列的序号。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
接着ADO.NET的记忆碎片(二)
SQLCommand命令、DbTransaction事务
C# SqlCommand和SqlDataAdapter的区别
ADO.NET SqlCommand - 斑点海豚 - 博客园
ExecuteReader的用法
ADO.NET入门教程(六) 谈谈Command对象与数据检索
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服