OracleLob.Write(Byte[], Int32, Int32) メソッド

定義

バイト シーケンスを現在の 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 操作は、書き込み操作の結果を返す可能性があります。

適用対象