OracleDataReader 类

定义

提供从数据源读取仅向前数据流数据行的方法。 此类不能被继承。

public ref class OracleDataReader sealed : MarshalByRefObject, IDisposable, System::Collections::IEnumerable, System::Data::IDataReader
public ref class OracleDataReader sealed : System::Data::Common::DbDataReader
public sealed class OracleDataReader : MarshalByRefObject, IDisposable, System.Collections.IEnumerable, System.Data.IDataReader
public sealed class OracleDataReader : System.Data.Common.DbDataReader
type OracleDataReader = class
    inherit MarshalByRefObject
    interface IDataReader
    interface IDisposable
    interface IDataRecord
    interface IEnumerable
type OracleDataReader = class
    inherit DbDataReader
Public NotInheritable Class OracleDataReader
Inherits MarshalByRefObject
Implements IDataReader, IDisposable, IEnumerable
Public NotInheritable Class OracleDataReader
Inherits DbDataReader
继承
OracleDataReader
继承
实现

示例

以下示例创建一个 OracleConnection、一个 OracleCommand和一个 OracleDataReader。 该示例读取数据,并将其写出到控制台。 最后,该示例关闭 OracleDataReader,然后关闭 OracleConnection

public void ReadData(string connectionString)
{
   string queryString = "SELECT EmpNo, EName FROM Emp";
   using (OracleConnection connection = new OracleConnection(connectionString))
   {
      OracleCommand command = new OracleCommand(queryString, connection);
      connection.Open();
      using(OracleDataReader reader = command.ExecuteReader())
      {
         // Always call Read before accessing data.
         while (reader.Read())
         {
            Console.WriteLine(reader.GetInt32(0) + ", " + reader.GetString(1));
         }
      }
   }
}
Public Sub ReadData(ByVal connectionString As String)
    Dim queryString As String = "SELECT EmpNo, EName FROM Emp"
    Using connection As New OracleConnection(connectionString)
        Dim command As New OracleCommand(queryString, connection)
        connection.Open()
        Using reader As OracleDataReader = command.ExecuteReader()
            ' Always call Read before accessing data.
            While reader.Read()
                Console.WriteLine(reader.GetInt32(0).ToString() + ", " _
                   + reader.GetString(1))
            End While
        End Using
    End Using
End Sub

注解

若要创建对象 OracleDataReader,必须调用 ExecuteReader 对象的方法 OracleCommand ,而不是直接使用构造函数。

正在读取数据时对另一个进程或线程对结果集所做的更改可能对用户 OracleDataReader可见。

IsClosedRecordsAffected 关闭后 OracleDataReader 可以调用的唯一属性。 在某些情况下,必须先呼叫 Close ,然后才能调用 RecordsAffected

可以在任意给定时间打开多个 OracleDataReader

以下两个Visual Basic示例演示如何使用 OracleDataReader 检索 Oracle REF CURSOR。 这些示例使用 Oracle Scott/Tiger 架构中定义的表,并且需要以下 PL/SQL 包和包正文。 必须在服务器上创建这些示例才能使用示例。

在 Oracle 服务器上创建以下 Oracle 包。

CREATE OR REPLACE PACKAGE CURSPKG AS
   TYPE T_CURSOR IS REF CURSOR;
   PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,
      IO_CURSOR IN OUT T_CURSOR);
   PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
      DEPTCURSOR OUT T_CURSOR);
END CURSPKG;
/

在 Oracle 服务器上创建以下 Oracle 包正文。

CREATE OR REPLACE PACKAGE BODY CURSPKG AS
    PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,
                               IO_CURSOR OUT T_CURSOR)
    IS
        V_CURSOR T_CURSOR;
    BEGIN
        IF N_EMPNO <> 0 THEN
             OPEN V_CURSOR FOR
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
                  FROM EMP, DEPT
                  WHERE EMP.DEPTNO = DEPT.DEPTNO
                        AND EMP.EMPNO = N_EMPNO;
        ELSE
             OPEN V_CURSOR FOR
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
                  FROM EMP, DEPT
                  WHERE EMP.DEPTNO = DEPT.DEPTNO;
        END IF;
        IO_CURSOR := V_CURSOR;
    END OPEN_ONE_CURSOR;
    PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
                                DEPTCURSOR OUT T_CURSOR)
    IS
        V_CURSOR1 T_CURSOR;
        V_CURSOR2 T_CURSOR;
    BEGIN
        OPEN V_CURSOR1 FOR SELECT * FROM EMP;
        OPEN V_CURSOR2 FOR SELECT * FROM DEPT;
        EMPCURSOR  := V_CURSOR1;
        DEPTCURSOR := V_CURSOR2;
    END OPEN_TWO_CURSORS;
END CURSPKG;
/

本Visual Basic示例执行 PL/SQL 存储过程,该存储过程返回 REF CURSOR 参数,并将值读取为 OracleDataReader

Private Sub ReadOracleData(ByVal connectionString As String)
   Dim connection As New OracleConnection(connectionString)
   Dim command As New OracleCommand()
   Dim reader As OracleDataReader

   connection.Open()
   command.Connection = connection
   command.CommandText = "CURSPKG.OPEN_ONE_CURSOR"
   command.CommandType = CommandType.StoredProcedure
   command.Parameters.Add(New OracleParameter("N_EMPNO", OracleType.Number)).Value = 7369
   command.Parameters.Add(New OracleParameter("IO_CURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output

   reader = command.ExecuteReader()
   While (reader.Read())
      ' Do something with the values.
   End While
   reader.Close()
   connection.Close()
End Sub

本Visual Basic示例执行 PL/SQL 存储过程,该存储过程返回两个 REF CURSOR 参数,并使用 OracleDataReader 读取值。

Private Sub ReadOracleData(ByVal connectionString As String)
   Dim dataSet As New DataSet()
   Dim connection As New OracleConnection(connectionString)
   Dim command As New OracleCommand()
   Dim reader As OracleDataReader

   connection.Open()
   command.Connection = connection
   command.CommandText = "CURSPKG.OPEN_TWO_CURSORS"
   command.CommandType = CommandType.StoredProcedure
   command.Parameters.Add(New OracleParameter("EMPCURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output
   command.Parameters.Add(New OracleParameter("DEPTCURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output

   reader = command.ExecuteReader(CommandBehavior.CloseConnection)
   While (reader.Read())
      ' Do something with the values.
   End While
   reader.NextResult()
   While (reader.Read())
        ' Do something with the values.
   End While
   reader.Close()
   connection.Close()
 End Sub

此 C# 示例创建 Oracle 表并使用数据加载它。 在运行后续示例之前,必须运行此示例,该示例演示如何使用 OracleDataReader OracleType 结构访问数据。

public void Setup(string connectionString)
{
   OracleConnection connection = new OracleConnection(connectionString);
   try
   {
      connection.Open();
      OracleCommand command = connection.CreateCommand();
      command.CommandText ="CREATE TABLE OracleTypesTable (MyVarchar2 varchar2(3000),MyNumber number(28,4) PRIMARY KEY,MyDate date, MyRaw raw(255))";
      command.ExecuteNonQuery();
      command.CommandText ="INSERT INTO OracleTypesTable VALUES ('test', 2, to_date('2000-01-11 12:54:01','yyyy-mm-dd hh24:mi:ss'), '0001020304')";
      command.ExecuteNonQuery();
      command.CommandText="SELECT * FROM OracleTypesTable";
   }
   catch(Exception)
   {
   }
   finally
   {
      connection.Close();
   }
}

此 C# 示例使用一个 OracleDataReader 访问数据,并使用多个 OracleType 结构来显示数据。

public void ReadOracleTypesExample(string connectionString)
{
   OracleConnection connection = new OracleConnection(connectionString);
   connection.Open();
   OracleCommand command = connection.CreateCommand();
   try
   {
      command.CommandText = "SELECT * FROM OracleTypesTable";
      OracleDataReader reader = command.ExecuteReader();
      reader.Read();
      //Using the Oracle specific getters for each type is faster than
      //using GetOracleValue.
      //First column, MyVarchar2, is a VARCHAR2 data type in Oracle Server
      //and maps to OracleString.
      OracleString oraclestring1 = reader.GetOracleString(0);
      Console.WriteLine("OracleString " + oraclestring1.ToString());

      //Second column, MyNumber, is a NUMBER data type in Oracle Server
      //and maps to OracleNumber.
      OracleNumber oraclenumber1 = reader.GetOracleNumber(1);
      Console.WriteLine("OracleNumber " + oraclenumber1.ToString());

      //Third column, MyDate, is a DATA data type in Oracle Server
      //and maps to OracleDateTime.
      OracleDateTime oracledatetime1 = reader.GetOracleDateTime(2);
      Console.WriteLine("OracleDateTime " + oracledatetime1.ToString());

      //Fourth column, MyRaw, is a RAW data type in Oracle Server and
      //maps to OracleBinary.
      OracleBinary oraclebinary1 = reader.GetOracleBinary(3);

      //Calling value on a null OracleBinary throws
      //OracleNullValueException; therefore, check for a null value.
      if (oraclebinary1.IsNull==false)
      {
         foreach(byte b in oraclebinary1.Value)
         {
            Console.WriteLine("byte " + b.ToString());
         }
      }
      reader.Close();
   }
   catch(Exception e)
   {
      Console.WriteLine(e.ToString());
   }
   finally
   {
      connection.Close();
   }
}

属性

名称 说明
Depth

获取一个值,该值指示当前行的嵌套深度。

FieldCount

获取当前行中的列数。

HasRows

获取一个值,该值 OracleDataReader 指示是否包含一行或多行。

IsClosed

指示是否已 OracleDataReader 关闭。

Item[Int32]

获取给定列序号的指定列的本机格式的值。

Item[String]

获取给定列名称的本机格式指定列的值。

RecordsAffected

获取通过执行 SQL 语句更改、插入或删除的行数。

VisibleFieldCount

获取不隐藏的 DbDataReader 字段数。

(继承自 DbDataReader)

方法

名称 说明
Close()

关闭 OracleDataReader 对象。

CreateObjRef(Type)

创建一个对象,其中包含生成用于与远程对象通信的代理所需的所有相关信息。

(继承自 MarshalByRefObject)
Dispose()

释放此对象使用的资源。

Dispose()

释放类的 DbDataReader 当前实例使用的所有资源。

(继承自 DbDataReader)
Dispose(Boolean)

释放由托管资源使用 DbDataReader 的非托管资源,并选择性地释放托管资源。

(继承自 DbDataReader)
Equals(Object)

确定指定的对象是否等于当前对象。

(继承自 Object)
GetBoolean(Int32)

获取指定列的值作为布尔值。

GetByte(Int32)

获取指定列作为字节的值。

GetBytes(Int32, Int64, Byte[], Int32, Int32)

从指定的列偏移量读取缓冲区中的字节流作为数组,从给定的缓冲区偏移量开始。

GetChar(Int32)

获取指定列的值作为字符。

GetChars(Int32, Int64, Char[], Int32, Int32)

从指定的列偏移量读取到缓冲区中的字符流作为数组,从给定的缓冲区偏移量开始。

GetData(Int32)

返回指定列序号的一个 IDataReader

GetData(Int32)

返回所请求列的嵌套数据读取器。

(继承自 DbDataReader)
GetDataTypeName(Int32)

获取源数据类型的名称。

GetDateTime(Int32)

获取作为对象的指定列 DateTime 的值。

GetDbDataReader(Int32)

返回 DbDataReader 请求的列序号的对象,该对象可通过提供程序特定的实现重写。

(继承自 DbDataReader)
GetDecimal(Int32)

获取作为对象的指定列 Decimal 的值。

GetDouble(Int32)

获取指定列的值作为双精度浮点数。

GetEnumerator()

返回可用于循环访问数据读取器中的行的一个 IEnumerator 值。

GetFieldType(Int32)

获取 Type 对象数据类型。

GetFieldValue<T>(Int32)

获取指定列的值作为请求的类型。

(继承自 DbDataReader)
GetFieldValueAsync<T>(Int32, CancellationToken)

以异步方式获取指定列的值作为请求的类型。

(继承自 DbDataReader)
GetFieldValueAsync<T>(Int32)

以异步方式获取指定列的值作为请求的类型。

(继承自 DbDataReader)
GetFloat(Int32)

获取指定列的值作为单精度浮点数。

GetGuid(Int32)

获取指定列的值作为全局唯一标识符 (GUID)。

GetHashCode()

用作默认哈希函数。

(继承自 Object)
GetInt16(Int32)

获取指定列作为 16 位有符号整数的值。

GetInt32(Int32)

获取指定列作为 32 位有符号整数的值。

GetInt64(Int32)

获取指定列的值作为 64 位有符号整数。

GetLifetimeService()

检索控制此实例的生存期策略的当前生存期服务对象。

(继承自 MarshalByRefObject)
GetName(Int32)

获取指定列的名称。

GetOracleBFile(Int32)

获取作为对象的指定列 OracleBFile 的值。

GetOracleBinary(Int32)

获取作为对象的指定列 OracleBinary 的值。

GetOracleDateTime(Int32)

获取作为对象的指定列 OracleDateTime 的值。

GetOracleLob(Int32)

获取作为对象的指定列 OracleLob 的值。

GetOracleMonthSpan(Int32)

获取作为对象的指定列 OracleMonthSpan 的值。

GetOracleNumber(Int32)

获取作为对象的指定列 OracleNumber 的值。

GetOracleString(Int32)

获取作为对象的指定列 OracleString 的值。

GetOracleTimeSpan(Int32)

获取作为对象的指定列 OracleTimeSpan 的值。

GetOracleValue(Int32)

获取其 Oracle 格式的指定序号处的列的值。

GetOracleValues(Object[])

获取当前行中的所有属性列(采用 Oracle 格式)。

GetOrdinal(String)

获取列序号,给定列的名称。

GetProviderSpecificFieldType(Int32)

获取一个 Object 是基础提供程序特定字段类型的表示形式。

GetProviderSpecificValue(Int32)

获取一个 Object 是基础提供程序特定字段类型的表示形式。

GetProviderSpecificValues(Object[])

获取作为基础提供程序特定值的表示形式的对象的数组。

GetSchemaTable()

返回一个 DataTable 描述 OracleDataReader 的列元数据。

GetStream(Int32)

获取从指定列检索数据的流。

(继承自 DbDataReader)
GetString(Int32)

获取指定列作为字符串的值。

GetTextReader(Int32)

获取从列检索数据的文本读取器。

(继承自 DbDataReader)
GetTimeSpan(Int32)

获取指定列的值作为一个 System.TimeSpan

GetType()

获取当前实例的 Type

(继承自 Object)
GetValue(Int32)

获取指定序号处的列的值,其本机格式。

GetValues(Object[])

使用当前行的列值填充对象的数组。

InitializeLifetimeService()

获取生存期服务对象来控制此实例的生存期策略。

(继承自 MarshalByRefObject)
IsDBNull(Int32)

获取一个值,该值指示列是包含不存在值还是缺失值。

IsDBNullAsync(Int32, CancellationToken)

异步获取一个值,该值指示列是包含不存在值还是缺失值。

(继承自 DbDataReader)
IsDBNullAsync(Int32)

异步获取一个值,该值指示列是包含不存在值还是缺失值。

(继承自 DbDataReader)
MemberwiseClone()

创建当前 Object的浅表副本。

(继承自 Object)
MemberwiseClone(Boolean)

创建当前 MarshalByRefObject 对象的浅表副本。

(继承自 MarshalByRefObject)
NextResult()

前进 OracleDataReader 到下一个结果。

NextResultAsync()

读取一批语句的结果时,异步将读取器提升到下一个结果。

(继承自 DbDataReader)
NextResultAsync(CancellationToken)

读取一批语句的结果时,异步将读取器提升到下一个结果。

(继承自 DbDataReader)
Read()

前进 OracleDataReader 到下一条记录。

ReadAsync()

异步将读取器前进到结果集中的下一条记录。

(继承自 DbDataReader)
ReadAsync(CancellationToken)

异步将读取器前进到结果集中的下一条记录。

(继承自 DbDataReader)
ToString()

返回一个表示当前对象的字符串。

(继承自 Object)

显式接口实现

名称 说明
IDataRecord.GetData(Int32)

有关此成员的说明,请参阅 GetData(Int32)

(继承自 DbDataReader)
IEnumerable.GetEnumerator()

返回循环访问集合的枚举器。

扩展方法

名称 说明
AsParallel(IEnumerable)

启用查询的并行化。

AsQueryable(IEnumerable)

IEnumerable 转换为 IQueryable

CanGetColumnSchema(DbDataReader)

获取一个值,该值指示是否可以 DbDataReader 获取列架构。

Cast<TResult>(IEnumerable)

IEnumerable 的元素强制转换为指定类型。

GetColumnSchema(DbDataReader)

获取 .DbColumn. 的列架构 (DbDataReader集合)

OfType<TResult>(IEnumerable)

根据指定类型筛选 IEnumerable 的元素。

适用于