OracleDataReader クラス
アセンブリ: System.Data.OracleClient (system.data.oracleclient.dll 内)
構文
解説
OracleDataReader を作成するには、コンストラクタを直接使用せずに、OracleCommand オブジェクトの ExecuteReader メソッドを呼び出す必要があります。
データの読み取り中に別のプロセスまたはスレッドが結果セットに加えた変更が、OracleDataReader のユーザーに表示されることがあります。
OracleDataReader を閉じた後に呼び出すことができるのは、IsClosed プロパティと RecordsAffected プロパティだけです。場合によっては、RecordsAffected を呼び出す前に Close を呼び出す必要があります。
OracleDataReader はいつでも複数開くことができます。
OracleDataReader を使用して Oracle の REF CURSOR を取得する、2 つの Visual Basic の例を次に示します。この例では、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; /
REF CURSOR パラメータを返す PL/SQL ストアド プロシージャを実行し、値を OracleDataReader として読み取る Visual Basic の例を示します。
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
2 つの REF CURSOR パラメータを返す PL/SQL ストアド プロシージャを実行し、OracleDataReader を使用して値を読み取る Visual Basic の例を示します。
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
Oracle テーブルを作成し、作成したテーブルにデータを読み込む C# の例を示します。この後の例 (OracleType 構造体を使用したデータに、OracleDataReader を使用してアクセスする例) を実行する前に、この例を実行する必要があります。
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(); } }
OracleDataReader を使用してデータにアクセスし、複数の OracleType 構造体を使用してデータを表示する C# の例を示します。
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(); } }
OracleConnection、OracleCommand、および OracleDataReader を作成する例を次に示します。この例では、データを読み取り、コンソールに出力します。最後に、この例では OracleDataReader を閉じてから、OracleConnection を閉じます。
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(); } }
System.MarshalByRefObject
System.Data.Common.DbDataReader
System.Data.OracleClient.OracleDataReader
プラットフォーム
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 によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
参照
- OracleDataReader クラスのページへのリンク