DataReader的使用方法

本文介绍如何使用ADO.NET DataReader从数据库高效检索只读、只进的数据流,包括创建DataReader、循环访问数据、关闭DataReader及获取架构信息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于DataReader

可以使用 ADO.NET DataReader 从数据库中检索只读、只进的数据流。因为每次在内存中始终只有一行,所以使用 DataReader 可提高应用程序的性能并减少系统开销。

当创建 Command 对象的实例后,可调用 Command.ExecuteReader 从数据源中检索行,从而创建一个 DataReader,如以下示例所示。

1SqlDataReader myReader = myCommand.ExecuteReader();

使用 DataReader 对象的 Read 方法可从查询结果中获取行。通过向 DataReader 传递列的名称或序号引用,可以访问返回行的每一列。不过,为了实现最佳性能,DataReader 提供了一系列方法,它们将使您能够访问其本机数据类型(GetDateTimeGetDoubleGetGuidGetInt32 等)形式的列值。有关类型化访问器方法的列表,请参阅 OleDbDataReader 类和 SqlDataReader 类 。如果在基础数据类型未知时使用类型化访问器方法,将减少在检索列值时所需的类型转换量。

以下代码示例循环访问一个 DataReader 对象,并从每个行中返回两个列。

1while (myReader.Read())
2  Console.WriteLine("/t{0}/t{1}", myReader.GetInt32(0), myReader.GetString(1));
3myReader.Close();

DataReader 提供未缓冲的数据流,该数据流使过程逻辑可以有效地按顺序处理从数据源中返回的结果。由于数据不在内存中缓存,所以在检索大量数据时,DataReader 是一种适合的选择。

关闭 DataReader

每次使用完 DataReader 对象后都应调用 Close 方法。

如果 Command 包含输出参数或返回值,那么在 DataReader 关闭之前,将无法访问这些输出参数或返回值。

请注意,当 DataReader 打开时,该 DataReader 将以独占方式使用 Connection。在初始 DataReader 关闭之前,将无法对Connection 执行任何命令(包括创建另一个 DataReader)。

多个结果集

如果返回的是多个结果集,DataReader 会提供 NextResult 方法来按顺序循环访问这些结果集,如以下代码示例所示。

01SqlCommand myCMD = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories;" +
02                                  "SELECT EmployeeID, LastName FROM Employees", nwindConn);
03nwindConn.Open();
04 
05SqlDataReader myReader = myCMD.ExecuteReader();
06 
07do
08{
09  Console.WriteLine("/t{0}/t{1}", myReader.GetName(0), myReader.GetName(1));
10 
11  while (myReader.Read())
12    Console.WriteLine("/t{0}/t{1}", myReader.GetInt32(0), myReader.GetString(1));
13 
14} while (myReader.NextResult());
15 
16myReader.Close();
17nwindConn.Close();

从 DataReader 中获取架构信息

 DataReader 打开时,可以使用 GetSchemaTable 方法检索有关当前结果集的架构信息。GetSchemaTable 将返回一个填充了行和列的 DataTable 对象,这些行和列包含当前结果集的架构信息。对于结果集的每一列,DataTable 都将包含一行。架构表行的每一列都映射到在结果集中返回的列的属性,其中 ColumnName 是属性的名称,而列的值为属性的值。以下代码示例为 DataReader 写出架构信息。

1DataTable schemaTable = myReader.GetSchemaTable();
2 
3foreach (DataRow myRow in schemaTable.Rows)
4{
5  foreach (DataColumn myCol in schemaTable.Columns)
6    Console.WriteLine(myCol.ColumnName + " = " + myRow[myCol]);
7  Console.WriteLine();
8}

 

转自:http://www.cnblogs.com/herbert/archive/2010/09/07/1820345.html

 

参考:http://www.cnblogs.com/xy8.cn/archive/2008/06/21/1227202.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值