OracleDataReader-Klasse
Bietet ein Verfahren für das Lesen eines Vorwärtsstreams von Datenzeilen aus einer Datenquelle. Die Klasse kann nicht geerbt werden.
Namespace: System.Data.OracleClient
Assembly: System.Data.OracleClient (in system.data.oracleclient.dll)
Syntax
'Declaration
Public NotInheritable Class OracleDataReader
Inherits DbDataReader
'Usage
Dim instance As OracleDataReader
public sealed class OracleDataReader : DbDataReader
public ref class OracleDataReader sealed : public DbDataReader
public final class OracleDataReader extends DbDataReader
public final class OracleDataReader extends DbDataReader
Hinweise
Anstelle der direkten Verwendung eines Konstruktors müssen Sie zum Erstellen eines OracleDataReader die ExecuteReader-Methode des OracleCommand-Objekts aufrufen.
Änderungen an einem Resultset, die während des Lesens der Daten durch einen anderen Prozess oder Thread vorgenommen werden, sind für Benutzer des OracleDataReader möglicherweise sichtbar.
Die IsClosed-Eigenschaft und die RecordsAffected-Eigenschaft sind die einzigen Eigenschaften, die nach dem Schließen des OracleDataReader aufgerufen werden können. In einigen Fällen müssen Sie Close aufrufen, bevor RecordsAffected aufgerufen werden kann.
Es können jederzeit mehrere OracleDataReader geöffnet sein.
Die folgenden beiden Visual Basic-Beispiele veranschaulichen, wie mit einem OracleDataReader ein Oracle-REF CURSOR abgerufen werden kann. In diesen Beispielen werden Tabellen verwendet, die gemäß dem Oracle Scott/Tiger-Schema definiert sind und für die das folgende PL/SQL-Paket und der folgende Paketkörper erforderlich sind. Sie müssen diese auf dem Server erstellen, um die Beispiele ausführen zu können.
Erstellen Sie das folgende Oracle-Paket auf dem Oracle-Server.
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;
/
Erstellen Sie den folgenden Oracle-Paketkörper auf dem Oracle-Server.
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;
/
In diesem Visual Basic-Beispiel wird eine gespeicherte PL/SQL-Prozedur ausgeführt, die einen REF CURSOR-Parameter zurückgibt, wobei der Wert als OracleDataReader gelesen wird.
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
In diesem Visual Basic-Beispiel wird eine gespeicherte PL/SQL-Prozedur ausgeführt, die zwei REF CURSOR-Parameter zurückgibt, wobei die Werte als OracleDataReader gelesen werden.
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
In diesem C#-Beispiel wird eine Oracle-Tabelle erstellt und mit Daten geladen. Sie müssen dieses Beispiel vor dem nachfolgenden Beispiel ausführen, in dem demonstriert wird, wie mithilfe eines OracleDataReader und unter Verwendung von OracleType-Strukturen auf die Daten zugegriffen wird.
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();
}
}
In diesem C#-Beispiel wird mit einem OracleDataReader auf Daten zugegriffen, wobei die Daten mit mehreren OracleType-Strukturen angezeigt werden.
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();
}
}
Beispiel
Im folgenden Beispiel werden eine OracleConnection, ein OracleCommand und ein OracleDataReader erstellt. Im Beispiel werden die Daten gelesen und in der Konsole ausgegeben. Abschließend werden im Beispiel der OracleDataReader und danach die OracleConnection geschlossen.
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()
Dim reader As OracleDataReader
reader = command.ExecuteReader()
' Always call Read before accessing data.
While reader.Read()
Console.WriteLine(reader.GetInt32(0).ToString() + ", " _
+ reader.GetString(1))
End While
' always call Close when done reading.
reader.Close()
End Using
End Sub
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();
OracleDataReader reader;
reader = command.ExecuteReader();
// Always call Read before accessing data.
while (reader.Read())
{
Console.WriteLine(reader.GetInt32(0) + ", " + reader.GetString(1));
}
// always call Close when done reading.
reader.Close();
}
}
Vererbungshierarchie
System.Object
System.MarshalByRefObject
System.Data.Common.DbDataReader
System.Data.OracleClient.OracleDataReader
Threadsicherheit
Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.
Plattformen
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1