OracleLob.Write(Byte[], Int32, Int32) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
バイト シーケンスを現在の OracleLob ストリームに書き込み、書き込んだバイト数の分だけストリーム内の現在位置を進めます。
public:
override void Write(cli::array <System::Byte> ^ buffer, int offset, int count);
public override void Write (byte[] buffer, int offset, int count);
override this.Write : byte[] * int * int -> unit
Public Overrides Sub Write (buffer As Byte(), offset As Integer, count As Integer)
パラメーター
- buffer
- Byte[]
バイト配列。 このメソッドは、count
から現在のストリームに、buffer
で指定されたバイト数だけコピーします。
- offset
- Int32
現在のストリームへのバイトのコピーを開始する位置を示す buffer
内のバイト オフセット。インデックス番号は 0 から始まります。
CLOB
型および NCLOB
型の場合、これは偶数である必要があります。
- count
- Int32
現在のストリームに書き込むバイト数。
CLOB
型および NCLOB
型の場合、これは偶数である必要があります。
例外
buffer
パラメーターが null 参照 (Visual Basic の場合は Nothing
) です。
offset
パラメーターまたは count
パラメーターの値が正の値ではありません。
- または -
offset
パラメーターと count
パラメーターの合計値が、buffer
の長さを超えています。
- または -
count
パラメーターまたは offset
パラメーターに指定された値が 0 より小さいか、4 GB を超えています。
- または -
CLOB
および NCLOB
データ型には、偶数のバイト数を指定する必要があります。
操作がトランザクション内で実行されていないか、OracleLob オブジェクトが null か、または接続が閉じられています。
オブジェクトが閉じられているか、破棄されています。
Oracle エラーが発生しました。
注釈
書き込み操作が成功すると、ストリーム内の位置は書き込まれたバイト数だけ進みます。 例外が発生した場合、ストリーム内の位置は変更されません。
の LOB
末尾を超えた書き込みは許可され、書き込まれたバイト数だけ が拡大 LOB
されます。
.NET Framework Data Provider for Oracle は、すべてのCLOB
データとデータを NCLOB
Unicode として処理します。 したがって、および NCLOB
データ型にアクセスするCLOB
場合は、常にバイト数を処理します。各文字は 2 バイトです。 たとえば、3 文字を含むテキストの文字列が、1 文字あたり 4 バイトの Oracle サーバーに として NCLOB
保存され、操作を実行 Write
する場合は、サーバーに 12 バイトとして格納されますが、文字列の長さは 6 バイトとして指定します。
を に LOB
書き込むには、SQL SELECT ステートメントで FOR UPDATE 句を使用して を取得 LOB
し、ローカル トランザクションを開始する必要があります。
次の例では、オブジェクトに書き込む方法を OracleLob 示します。
public static void WriteLobExample(OracleCommand command)
{
// Note: Updating LOB data requires a transaction.
command.Transaction = command.Connection.BeginTransaction();
// Select some data.
// Table Schema:
// "CREATE TABLE tablewithlobs (a int, b BLOB, c BLOB)";
// "INSERT INTO tablewithlobs values (1, 'AA', 'AAA')";
command.CommandText = "SELECT * FROM TableWithLobs FOR UPDATE";
OracleDataReader reader = command.ExecuteReader();
using(reader)
{
// Obtain the first row of data.
reader.Read();
// Obtain both LOBs.
OracleLob BLOB1 = reader.GetOracleLob(1);
OracleLob BLOB2 = reader.GetOracleLob(2);
// Perform any desired operations on the LOB, (read, position, and so on).
// ...
// Example - Writing binary data (directly to the backend).
// To write, you can use any of the stream classes, or write raw binary data using
// the OracleLob write method. Writing character vs. binary is the same;
// however note that character is always in terms of Unicode byte counts
// (for example: even number of bytes - 2 bytes for every Unicode character).
var buffer = new byte[100];
buffer[0] = 0xCC;
buffer[1] = 0xDD;
BLOB1.Write(buffer, 0, 2);
BLOB1.Position = 0;
Console.WriteLine(BLOB1.LobType + ".Write(" + buffer + ", 0, 2) => " + BLOB1.Value);
// Example - Copying data into another LOB.
long actual = BLOB1.CopyTo(BLOB2);
Console.WriteLine(BLOB1.LobType + ".CopyTo(" + BLOB2.Value + ") => " + actual);
// Commit the transaction now that everything succeeded.
// Note: On error, Transaction.Dispose is called (from the using statement)
// and will automatically roll-back the pending transaction.
command.Transaction.Commit();
}
}
注意
読み取り専用 LOB
に対する書き込み操作は成功する可能性がありますが、サーバー上の を LOB
更新しません。 ただし、この場合、 のローカル コピー LOB
が更新されます。 したがって、オブジェクトに対する後の読み取り OracleLob 操作は、書き込み操作の結果を返す可能性があります。
適用対象
.NET