_
| Oracle® Data Provider for .NET開発者ガイド リリース9.2.0.4 部品番号 B13807-01 |
|
Oracle.DataAccess.Clientネームスペース、6/30
OracleDataReaderオブジェクトは、順方向のみ、かつ読取り専用のメモリー内の結果セットを表します。
DataSetと異なり、OracleDataReaderは接続されたままで、一度に1行をフェッチします。
Object
MarshalByRefObject
OracleDataReader
// C# public sealed class OracleDataReader : MarshalByRefObject, IEnumerable, IDataReader, IDisposable, IDataRecord
インスタンス・メソッドではスレッド・セーフティを保証しませんが、すべてのpublic staticメソッドはスレッド・セーフです。
OracleDataReaderインスタンスを構成するには、OracleCommandオブジェクトのExecuteReaderメソッドをコールします。DataReaderをクローズした後、または破棄した後にアクセスできるプロパティは、IsClosedおよびRecordsAffectedのみです。
この項のOracleDataReaderの例は、次のように定義されたEMPINFO表を基にしています。
CREATE TABLE empInfo ( empno NUMBER(4) PRIMARY KEY, empName VARCHAR2(20) NOT NULL, hiredate DATE, salary NUMBER(7,2), jobDescription Clob, byteCodes BLOB );
EMPINFO表には、次の値が含まれています。
EMPNO EMPNAME HIREDATE SALARY JOBDESCRIPTION BYTECODES (Hex Values) ===== ======= ======== ====== ============== ============ 1 KING 01-MAY-81 12345.67 SOFTWARE ENGR {0x12, 0x34} 2 SCOTT 01-SEP-75 34567.89 MANAGER {0x56, 0x78} 3 BLAKE 01-OCT-90 9999.12 TRANSPORT {0x23, 0x45} 4 SMITH NULL NULL NULL NULL
次の例では、EMPINFO表のデータを取得しています。
//C # //This method retrieves all the data from EMPINFO table public void ReadEmpInfo(string connStr) { string cmdStr = "SELECT * FROM EMPINFO"; OracleConnection connection = new OracleConnection(connStr); OracleCommand cmd = new OracleCommand(cmdStr, connection); connection.Open(); OracleDataReader reader = cmd.ExecuteReader(); //declare the variables to retrieve the data in EmpInfo short empNo; string empName; DateTime hireDate; double salary; string jobDesc; byte[] byteCodes = new byte[10]; //read the next row until end of row while (reader.Read()) { empNo = reader.GetInt16(0); Console.WriteLine("Employee number: " + empNo); empName = reader.GetString(1); Console.WriteLine("Employee name: " + empName); //the following columns can have NULL value, so it //is important to call IsDBNull before getting the column data if (!reader.IsDBNull(2)) { hireDate = reader.GetDateTime(2); Console.WriteLine("Hire date: " + hireDate); } if (!reader.IsDBNull(3)) { salary = reader.GetDouble(3); Console.WriteLine("Salary: " + salary); } if (!reader.IsDBNull(4)) { jobDesc = reader.GetString(4); Console.WriteLine("Job Description: " + jobDesc); } if (!reader.IsDBNull(5)) { long len = reader.GetBytes(5, 0, byteCodes, 0, 10); Console.Write("Byte codes: " ); for (int i = 0; i < len; i++) Console.Write(byteCodes[i].ToString("x")); Console.WriteLine(); } Console.WriteLine(); //done reading one row } //Done Reading EMPINFO table //Close the reader reader.Close(); // Close the connection connection.Close(); }
ネームスペース: Oracle.DataAccess.Client
アセンブリ: Oracle.DataAccess.dll
OracleDataReaderのメンバーを次の表に示します。
OracleDataReaderのstaticメソッドを表4-42に示します。
| メソッド | 説明 |
|---|---|
|
|
|
OracleDataReaderのプロパティを表4-43に示します。
OracleDataReaderのpublicメソッドを表4-44に示します。
OracleDataReaderのstaticメソッドを表4-45に示します。
| メソッド | 説明 |
|---|---|
|
|
|
OracleDataReaderのプロパティを表4-46に示します。
このプロパティは、現在の行に対するネストの深さを示す値を取得します。
// C# public int Depth {get;}
現在の行に対するネストの深さ
IDataReader
InvalidOperationException: リーダーがクローズされています。
デフォルトは0です。
Oracleはネストをサポートしないので、このプロパティは常に0を返します。
このプロパティは、OracleDataReaderの内部キャッシュのサイズを指定します。
// C# public long FetchSize {get; set;}
OracleDataReaderが内部キャッシュに使用するメモリー・サイズをバイト単位で指定するlong
ArgumentException: 指定されたFetchSize値が無効です。
デフォルトは、OracleCommandのFetchSizeプロパティの値です。
FetchSizeプロパティは、結果セットを返すコマンド実行によって作成されるOracleDataReaderに継承されます。OracleDataReaderオブジェクトのFetchSizeプロパティにより、1回のサーバー・ラウンドトリップで内部キャッシュに取り込まれるデータ・サイズが決定します。
| 関連項目:
|
このプロパティは、結果セットの列数を取得します。
// C# public int FieldCount {get;}
結果セットが存在する場合はそれに含まれる列数、存在しない場合は0
IDataRecord
InvalidOperationException: リーダーがクローズされています。
デフォルトは0です。
問合せが結果セットを返さない場合、このプロパティの値は0になります。
このプロパティは、データ・リーダーがクローズしているかどうかを示します。
// C# public bool IsClosed {get;}
OracleDataReaderがクローズした状態の場合、trueを返し、それ以外の場合、falseを返します。
IDataReader
デフォルトはtrueです。
OracleDataReaderをクローズした後にアクセスできるプロパティは、IsClosedおよびRecordsAffectedのみです。
このプロパティは、.NETデータ型の列の値を取得します。
このプロパティは、列インデックスで指定された列の.NET値を取得します。
このプロパティは、列名で指定された列の.NET値を取得します。
このプロパティは、列インデックスで指定された列の.NET値を取得します。
// C# public object this[int index] {get;}
指定された列の.NET値
IDataRecord
デフォルトは適用されません。
C#では、このプロパティはこのクラスのインデクサになります。
このプロパティは、列名で指定された列の.NET値を取得します。
// C# public object this[string columnName] {get;}
指定された列の.NET値
IDataRecord
デフォルトは適用されません。
名前によって指定された列を見つける際、大/小文字を区別して検索されます。これに失敗した場合は、大/小文字を区別せずに検索が行われます。
C#では、このプロパティはこのクラスのインデクサになります。
このプロパティは、LOB列について、OracleDataReaderが最初にフェッチするサイズを指定します。
// C# public int InitialLOBFetchSize {get;}
取得するチャンク・サイズ
InvalidOperationException: リーダーがクローズされています。
InitialLOBFetchSizeで設定できる最大値は32767です。このプロパティをこれより大きい値に設定すると、プロバイダにより32767にリセットされます。
デフォルトは、この値の継承元であるOracleCommand.InitialLOBFetchSizeです。
| 関連項目:
|
このプロパティは、LONG列およびLONG RAW列について、OracleDataReaderが最初にフェッチするサイズを指定します。
// C# public long InitialLONGFetchSize {get;}
取得するチャンク・サイズ。デフォルトは0です。
InvalidOperationException: リーダーがクローズされています。
InitialLONGFetchSizeで設定できる最大値は32767です。このプロパティをこれより大きい値に設定すると、プロバイダにより32767にリセットされます。
デフォルトは、この値の継承元であるOracleCommand.InitialLONGFetchSizeです。
このプロパティは、OracleDataReaderに対して読取り専用です。
| 関連項目:
|
このプロパティは、SQL文の実行によって変更、挿入または削除された行数を取得します。
// C# public int RecordsAffected {get;}
SQL文の実行に影響の受けた行数
IDataReader
デフォルトは0です。
SELECT文の場合は、-1が返されます。
OracleDataReaderをクローズした後にアクセスできるプロパティは、IsClosedおよびRecordsAffectedのみです。
OracleDataReaderのpublicメソッドを表4-47に示します。
このメソッドは、OracleDataReaderをクローズします。
// C# public void Close();
IDataReader
Closeメソッドは、OracleDataReaderと関連付けられたすべてのリソースを解放します。
OracleDataReaderクラスのコード例には、Closeメソッドが含まれています。OracleDataReaderの概要の「例」を参照してください。
このメソッドは、オブジェクトによって割り当てられたリソースまたはメモリーを解放します。
// C# public void Dispose();
IDisposable
Disposeメソッドは、OracleDataReaderもクローズします。
このメソッドは、指定された列のバイト値を返します。
// C# public byte GetByte(int index);
バイトで表される列の値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、列の指定されたオフセット(バイト)から最大バイト数以下のデータを指定されたバイト配列に移入します。
// C# public long GetBytes(int index, long fieldOffset, byte[] buffer, int bufferOffset, int length);
index
0から始まる列インデックス。
fieldOffset
読込みが開始される読込み元の列内のオフセット(バイト)。
buffer
データが読み込まれるバイト配列。
bufferOffset
データの読込みが開始される読込み先のバッファ内のオフセット(バイト)。
length
読み込まれる最大バイト数(バイト)。
読み込まれたバイト数
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドは、バッファに読み込まれるバイト数を返します。メソッドが同じ列に対して以前にコールされている場合は、実際のフィールド長より短くなることがあります。
NULL参照がバッファに渡されると、バイト単位のフィールド長が返されます。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、列の指定されたオフセット(文字)から最大文字数以下のデータを指定された文字配列に移入します。
// C# public long GetChars(int index, long fieldOffset, char[] buffer, int bufferOffset, int length);
index
0から始まる列インデックス。
fieldOffset
読込みが開始される読込み元の列内のインデックス(文字)。
buffer
データが読み込まれる文字配列。
bufferOffset
データの読込みが開始される読込み先のバッファ内のインデックス(文字)。
length
読み込まれる最大文字数(文字)。
読み込まれた文字数
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドは、バッファに読み込まれる文字数を返します。メソッドが同じ列に対して以前にコールされている場合は、実際のフィールド長より短くなることがあります。
NULL参照がバッファに渡されると、文字単位のフィールド長が返されます。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定された列のODP.NET型名を返します。
// C# public string GetDataTypeName(int index);
列のODP.NET型の名前
IDataRecord
InvalidOperationException: リーダーがクローズされています。
IndexOutOfRangeException: 列インデックスが無効です。
このメソッドは、指定された列のDateTime値を返します。
// C# public DateTime GetDateTime(int index);
列のDateTime値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたNUMBER列のdecimal値を返します。
// C# public decimal GetDecimal(int index);
列のdecimal値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたNUMBER列のdouble値を返します。
// C# public double GetDouble(int index);
列のdouble値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定された列のTypeを返します。
// C# public Type GetFieldType(int index);
列のデフォルトの.NET型のType
IDataRecord
InvalidOperationException: リーダーがクローズされています。
IndexOutOfRangeException: 列インデックスが無効です。
このメソッドは、指定されたNUMBER列のfloat値を返します。
// C# public float GetFloat(int index);
列のfloat値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたNUMBER列のInt16値を返します。
// C# public short GetInt16(int index);
列のInt16値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたNUMBER列のInt32値を返します。
// C# public int GetInt32(int index);
列のInt32値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたNUMBER列のInt64値を返します。
// C# public long GetInt64(int index);
列のInt64値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定された列の名前を返します。
// C# public string GetName(int index);
列の名前
IDataRecord
InvalidOperationException: リーダーがクローズされています。
IndexOutOfRangeException: 列インデックスが無効です。
このメソッドは、指定されたBFILE列のOracleBFileオブジェクトを返します。
// C# public OracleBFile GetOracleBFile(int index);
列のOracleBFile値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定された列のOracleBinary構造体を返します。
// C# public OracleBinary GetOracleBinary(int index);
列のOracleBinary値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
GetOracleBinaryは、次のOracle型で使用されます。
このメソッドは、指定されたBLOB列のOracleBlobオブジェクトを返します。
// C# public OracleBlob GetOracleBlob(int index);
列のOracleBlob値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
GetOracleBlobForUpdateは、指定されたBLOB列の更新可能なOracleBlobオブジェクトを返します。
このメソッドは、指定されたBLOB列の更新可能なOracleBlobオブジェクトを返します。
このメソッドは、WAIT句を使用して、指定されたBLOB列の更新可能なOracleBlobオブジェクトを返します。
このメソッドは、指定されたBLOB列の更新可能なOracleBlobオブジェクトを返します。
// C# public OracleBlob GetOracleBlobForUpdate(int index);
更新可能なOracleBlobオブジェクト
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
OracleCommandのExecuteReader()メソッドがコールされると、OracleDataReaderによってフェッチされるすべてのデータは、特定のスナップショットからのものになります。このため、同じ列でアクセッサ・メソッドをコールすると必ず同じ値が返されます。しかし、GetOracleBlobForUpdate()メソッドをコールした場合、FOR UPDATE句を使用して行をロックしている間も、サーバー・ラウンドトリップが発生し、現在のBLOBデータへの参照を取得します。つまり、元のスナップショットから取得されないため、GetOracleBlob()から取得されたOracleBlobは、GetOracleBlobForUpdate()から取得されたOracleBlobとは値が異なることがあります。
このメソッドをコールするとBLOB列がロックされるので、返されたOracleBlobオブジェクトは、BLOBを安全に更新するために使用できます。
内部でこのメソッドをコールすると、WAIT句のないSELECT..FOR UPDATE文が実行されます。このため、その行のロックが取得されるまで、文が無制限に待機します。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
次の例では、リーダーから更新するためにOracleBlobオブジェクトを取得し、OracleBlobオブジェクトを更新した後、トランザクションをコミットしています。
// C# public static void ReadOracleBlobForUpdate(string connStr) { //get the job description for empno = 1 string cmdStr = "SELECT BYTECODES, EMPNO FROM EMPINFO where EMPNO = 1"; OracleConnection connection = new OracleConnection(connStr); OracleCommand cmd = new OracleCommand(cmdStr, connection); connection.Open(); //Since we are going to update the OracleBlob object, we will //have to create a transaction OracleTransaction txn = connection.BeginTransaction(); //get the reader OracleDataReader reader = cmd.ExecuteReader(); //declare the variables to retrieve the data in EmpInfo OracleBlob byteCodesBlob; //read the first row reader.Read(); if (!reader.IsDBNull(0)) { byteCodesBlob = reader.GetOracleBlobForUpdate(0); //Close the reader reader.Close(); //Update the job description Clob object byte[] addedBytes = new byte[2] {0, 0}; byteCodesBlob.Append(addedBytes, 0, addedBytes.Length); //Now commit the transaction txn.Commit(); } else reader.Close(); // Close the connection connection.Close(); }
このメソッドは、WAIT句を使用して、指定されたBLOB列の更新可能なOracleBlobオブジェクトを返します。
// C# public OracleBlob GetOracleBlobForUpdate(int index, int wait);
更新可能なOracleBlobオブジェクト
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
OracleCommandのExecuteReader()メソッドがコールされると、OracleDataReaderによってフェッチされるすべてのデータは、特定のスナップショットからのものになります。このため、同じ列でアクセッサ・メソッドをコールすると必ず同じ値が返されます。しかし、GetOracleBlobForUpdate()メソッドをコールした場合、FOR UPDATE句を使用して行をロックしている間も、サーバー・ラウンドトリップが発生し、現在のBLOBデータへの参照を取得します。つまり、元のスナップショットから取得されないため、GetOracleBlob()から取得されたOracleBlobは、GetOracleBlobForUpdate()から取得されたOracleBlobとは値が異なることがあります。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドをコールするとBLOB列がロックされるので、返されたOracleBlobオブジェクトは、BLOBを安全に更新するために使用できます。
内部でこのメソッドをコールすると、行をロックするSELECT..FOR UPDATE文が実行されます。
waitの値に応じて、文に追加されるWAIT句は異なります。waitの値と、その場合の句を示します。
0
NOWAITがSELECT..FOR UPDATE文の最後に追加されます。ロックが取得されているかどうかにかかわらず、すぐに文が実行されます。ロックが取得されていない場合は、例外がスローされます。
n
WAIT nがSELECT..FOR UPDATE文の最後に追加されます。ロックが取得されるとすぐに文が実行されます。ただし、n秒間にロックを取得できなかった場合は、このメソッド・コールによって例外がスローされます。
WAIT n機能は、Oracle9i以上でのみ使用できます。Oracle9iより前のバージョンでは、nは暗黙的に-1として扱われ、SELECT..FOR UPDATE文の最後には何も追加されません。
-1
SELECT..FOR UPDATEの最後には何も追加されません。ロックを取得できるまで、文の実行は無制限に待機されます。
GetOracleBlobForUpdateメソッドは類似しています。使用方法を示すコードの例は、「例」を参照してください。
このメソッドは、指定されたCLOB列のOracleClobオブジェクトを返します。
// C# public OracleClob GetOracleClob(int index);
列のOracleClob値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
GetOracleClobForUpdateは、指定されたCLOB列の更新可能なOracleClobオブジェクトを返します。
このメソッドは、指定されたCLOB列の更新可能なOracleClobオブジェクトを返します。
このメソッドは、WAIT句を使用して、指定されたCLOB列の更新可能なOracleClobオブジェクトを返します。
このメソッドは、指定されたCLOB列の更新可能なOracleClobオブジェクトを返します。
// C# public OracleClob GetOracleClobForUpdate(int index);
更新可能なOracleClob
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
OracleCommandのExecuteReader()メソッドがコールされると、OracleDataReaderによってフェッチされるすべてのデータは、特定のスナップショットからのものになります。このため、同じ列でアクセッサ・メソッドをコールすると必ず同じ値が返されます。しかし、GetOracleClobForUpdate()メソッドをコールした場合、FOR UPDATE句を使用して行をロックしている間も、サーバー・ラウンドトリップが発生し、現在のCLOBデータへの参照を取得します。つまり、元のスナップショットから取得されないため、GetOracleClob()から取得されたOracleClobは、GetOracleClobForUpdate()から取得されたOracleClobとは値が異なることがあります。
このメソッドをコールするとCLOB列がロックされるので、返されたOracleClobオブジェクトは、CLOBを安全に更新するために使用できます。
内部でこのメソッドをコールすると、WAIT句のないSELECT..FOR UPDATE文が実行されます。このため、その行のロックが取得されるまで、文が無制限に待機します。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
次の例では、リーダーから更新するためにOracleClobオブジェクトを取得し、OracleClobオブジェクトを更新した後、トランザクションをコミットしています。
// C# public static void ReadOracleClobForUpdate(string connStr) { //get the job description for empno = 1 string cmdStr = "SELECT JOBDESCRIPTION, EMPNO FROM EMPINFO where EMPNO = 1"; OracleConnection connection = new OracleConnection(connStr); OracleCommand cmd = new OracleCommand(cmdStr, connection); connection.Open(); //Since we are going to update the OracleClob object, we will //have to create a transaction OracleTransaction txn = connection.BeginTransaction(); //get the reader OracleDataReader reader = cmd.ExecuteReader(); //declare the variables to retrieve the data in EmpInfo OracleClob jobDescClob; //read the first row reader.Read(); if (!reader.IsDBNull(0)) { jobDescClob = reader.GetOracleClobForUpdate(0); //Close the reader reader.Close(); //Update the job description Clob object char[] jobDesc = "-SALES".ToCharArray(); jobDescClob.Append(jobDesc, 0, jobDesc.Length); //Now commit the transaction txn.Commit(); } else reader.Close(); // Close the connection connection.Close(); }
このメソッドは、WAIT句を使用して、指定されたCLOB列の更新可能なOracleClobオブジェクトを返します。
// C# public OracleClob GetOracleClobForUpdate(int index, int wait);
更新可能なOracleClob
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
OracleCommandのExecuteReader()メソッドがコールされると、OracleDataReaderによってフェッチされるすべてのデータは、特定のスナップショットからのものになります。このため、同じ列でアクセッサ・メソッドをコールすると必ず同じ値が返されます。しかし、GetOracleClobForUpdate()メソッドをコールした場合、FOR UPDATE句を使用して行をロックしている間も、サーバー・ラウンドトリップが発生し、現在のCLOBデータへの参照を取得します。つまり、元のスナップショットから取得されないため、GetOracleClob()から取得されたOracleClobは、GetOracleClobForUpdate()から取得されたOracleClobとは値が異なることがあります。
内部でこのメソッドをコールすると、行をロックするSELECT..FOR UPDATE文が実行されます。
このメソッドをコールするとCLOB列がロックされるので、返されたOracleClobオブジェクトは、CLOBを安全に更新するために使用できます。
waitの値に応じて、文に追加されるWAIT句は異なります。waitの値と、その場合の句を示します。
0
NOWAITがSELECT..FOR UPDATE文の最後に追加されます。ロックが取得されているかどうかにかかわらず、すぐに文が実行されます。ロックが取得されていない場合は、例外がスローされます。
n
WAIT nがSELECT..FOR UPDATE文の最後に追加されます。ロックが取得されるとすぐに文が実行されます。ただし、n秒間にロックを取得できなかった場合は、このメソッド・コールによって例外がスローされます。
WAIT n機能は、Oracle9i以上でのみ使用できます。Oracle9iより前のバージョンでは、nは暗黙的に-1として扱われ、SELECT..FOR UPDATE文の最後には何も追加されません。
-1
SELECT..FOR UPDATEの最後には何も追加されません。ロックを取得できるまで、文の実行は無制限に待機されます。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
GetOracleClobForUpdateメソッドは類似しています。使用方法を示すコードの例は、「例」 を参照してください。
このメソッドは、指定されたDATE列のOracleDate構造体を返します。
// C# public OracleDate GetOracleDate(int index);
列のOracleDate値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたNUMBER列のOracleDecimal構造体を返します。
// C# public OracleDecimal GetOracleDecimal(int index);
列のOracleDecimal値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたINTERVAL DAY TO SECOND列のOracleIntervalDS構造体を返します。
// C# public OracleIntervalDS GetOracleIntervalDS(int index);
列のOracleIntervalDS値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたINTERVAL YEAR TO MONTH列のOracleIntervalYM構造体を返します。
// C# public OracleIntervalYM GetOracleIntervalYM(int index);
列のOracleIntervalYM値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定された列のOracleString構造体を返します。文字列はUnicode文字列として格納されます。
// C# public OracleString GetOracleString(int index);
列のOracleString値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
GetOracleStringは、次のOracle列型で使用されます。
このメソッドは、OracleのTimeStamp列のOracleTimeStamp構造体を返します。
// C# public OracleTimeStamp GetOracleTimeStamp(int index);
列のOracleTimeStamp値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
GetOracleTimeStampは、Oracle型のTimeStampで使用されます。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたOracleのTIMESTAMP WITH LOCAL TIME ZONE列のOracleTimeStampLTZ構造体を返します。
// C# public OracleTimeStampLTZ GetOracleTimeStampLTZ(int index);
列のOracleTimeStampLTZ値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
GetOracleTimeStampLTZは、Oracle型のTIMESTAMP WITH LOCAL TIME ZONE列で使用されます。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたOracleのTIMESTAMP WITH TIME ZONE列のOracleTimeStampTZ構造体を返します。
// C# public OracleTimeStampTZ GetOracleTimeStampTZ(int index);
列のOracleTimeStampTZ値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
Oracle型のTIMESTAMP WITH TIME ZONE列で使用されます。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたXMLType列のOracleXmlTypeオブジェクトを返します。
// C# public OracleXmlType GetOracleXmlType(int index);
列のOracleXmlType値
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このプロパティは、Oracle9iリリース2(9.2)以上でのみ使用可能です。
このメソッドは、指定された列の値をODP.NET型として返します。
// C# public object GetOracleValue(int index);
ODP.NET型の列の値
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
このメソッドは、すべての列の値をODP.NET型として取得します。
// C# public int GetOracleValues(object[] values);
values配列内のODP.NET型の数
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
このメソッドは、各列の値を個々に取得するのではなく、すべての列の値を取得する方法を提供します。
取得された列の値の数は、values配列の最小の長さであり、結果セットの列数です。
このメソッドは、指定された列名の0から始まる順序番号(インデックス)を返します。
// C# public int GetOrdinal(string name);
列インデックス
IDataRecord
InvalidOperationException: リーダーがクローズされています。
IndexOutOfRangeException: 列インデックスが無効です。
名前によって指定された列を見つける際、大/小文字を区別して検索されます。これに失敗した場合は、大/小文字を区別せずに検索が行われます。
このメソッドは、OracleDataReaderの列メタデータを記述するDataTableを返します。
// C# public DataTable GetSchemaTable();
結果セットのメタデータを含むDataTable
IDataReader
InvalidOperationException: 接続がクローズされているか、またはリーダーがクローズされています。
OracleDataReader.GetSchemaTable()は、SchemaTableを返します。
OracleDataReaderのSchemaTable
OracleDataReaderのSchemaTableは、OracleDataReaderの列メタデータを記述するDataTableです。
SchemaTableの列の順序は次のとおりです。
| 名前 | 名前タイプ | 説明 |
|---|---|---|
|
|
|
列の名前。 |
|
|
|
列の |
|
|
|
列の値の可能な最大長。
詳細は、「IsByteSemantic」 を参照してください。 |
|
|
|
この列は、Oracleの |
|
|
|
この列は、Oracleの |
|
|
|
実表が このプロパティの値は、選択リストでその実表の列が出現するたびに同じです。 |
|
|
|
列が行セットにおける列セットの1つで、これらを基に行が一意に識別される場合、 この列セットは、次のいずれかから、優先順位の高い順に生成できます。
行を一意に識別するために列が必要ない場合は、 |
|
|
|
列が |
|
|
|
列に別名が使用されている場合は、データベースの列の名前。 |
|
|
|
列を含むデータベース内のスキーマ名。 |
|
|
|
列を含むデータベース内の表またはビューの名前。 |
|
|
|
共通言語ランタイム型へのマップ。 |
|
|
|
列のデータベース列型( |
|
|
|
|
|
|
|
列が別名の場合は |
|
|
|
Oracle9iより前のバージョンのデータベースに接続されている場合、この値は常に |
|
|
|
列が式の場合は |
|
|
|
列が非表示の場合は |
|
|
|
列が読取り専用の場合は |
|
|
|
列が |
この例では、リーダーからSchemaTableを作成し、使用しています。
// C# public static void ReadSchemaTable(string connStr) { ..... //get the reader OracleDataReader reader = cmd.ExecuteReader(); //get the schema table DataTable schemaTable = reader.GetSchemaTable(); //retrieve the first column info. DataRow col0 = schemaTable.Rows[0]; //print out the column info Console.WriteLine("Column name: " + col0["COLUMNNAME"]); Console.WriteLine("Precision: " + col0["NUMERICPRECISION"]); Console.WriteLine("Scale: " + col0["NUMERICSCALE"]); ..... }
このメソッドは、指定された列のstring値を返します。
// C# public string GetString(int index);
列のstring値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、指定されたINTERVAL DAY TO SECOND列のTimeSpan値を返します。
// C# public TimeSpan GetTimeSpan(int index);
列のTimeSpan値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、列の値を.NET型として返します。
// C# public object GetValue(int index);
.NET型の列の値
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
このメソッドがNUMBER列に対してコールされた場合、返される.NET型は列の精度および位取りによって決まります。たとえば、列がNUMBER (4,0)として定義されている場合、この列の値はSystem.Int16として取得されます。
精度および位取りが、.NET型でその列に存在する可能性のあるすべての値を表せないものである場合、値はSystem.Decimalで返されます(可能な場合)。値がSystem.Decimalで表せない場合は、例外が発生します。たとえば、列がNUMBER (20,10)として定義されている場合、この列の値はSystem.Decimalとして取得されます。
このメソッドは、すべての列の値を.NET型として取得します。
// C# public int GetValues(object[ ] values);
values配列に含まれるオブジェクト数
IDataRecord
InvalidOperationException: 接続がクローズされているか、リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
このメソッドは、各列の値を個々に取得するのではなく、すべての列の値を取得する方法を提供します。
取得された列の値の数は、値配列の最小の長さであり、結果セットの列数です。
このメソッドは、XMLType列の内容を.NETのXmlTextReaderオブジェクトのインスタンスとして返します。
// C# public XmlReader GetXmlReader(int index);
.NET XmlTextReader
InvalidCastException: この列型に対してアクセッサ・メソッドが無効か、または列の値がnullです。
このメソッドをコールする前に、IsDBNullをコールしてnull値がないか確認してください。
このメソッドは、列の値がnullかどうかを示します。
// C# public bool IsDBNull(int index);
列がnull値の場合、true、それ以外の場合、falseを返します。
IDataRecord
InvalidOperationException: リーダーがクローズされているか、Read()がコールされていないか、またはすべての行が読み込まれました。
IndexOutOfRangeException: 列インデックスが無効です。
その他のアクセッサ・メソッドをコールする前に、このメソッドをコールしてnull値がないか確認してください。
OracleDataReaderクラスのコード例には、IsDBNullメソッドが含まれています。「例」を参照してください。
このメソッドは、データ・リーダーを次の結果セットに進めます。
// C# public bool NextResult();
別の結果セットが存在する場合、true、それ以外の場合、falseを返します。
IDataReader
InvalidOperationException: 接続がクローズされているか、またはリーダーがクローズされています。
複数の結果セットを返すストアド・プロシージャの実行から結果を読み込む場合に、NextResultが使用されます。
このメソッドは、結果セット内の次の行を読み込みます。
// C# public bool Read();
次の行が存在する場合、true、それ以外の場合、falseを返します。
IDataReader
InvalidOperationException: 接続がクローズされているか、またはリーダーがクローズされています。
データ・リーダーの最初の位置は、1行目の前です。このため、1行目をフェッチするためにReadメソッドをコールする必要があります。読み込まれたばかりの行が、現在の行とみなされます。OracleDataReaderが読み込む行がそれ以上ない場合は、falseを返します。
OracleDataReaderクラスのコード例には、Readメソッドが含まれています。「例」を参照してください。
|
|
![]() Copyright © 2002, 2003 Oracle Corporation. All Rights Reserved. |
|