OracleLob.Write(Byte[], Int32, Int32) OracleLob.Write(Byte[], Int32, Int32) OracleLob.Write(Byte[], Int32, Int32) OracleLob.Write(Byte[], Int32, Int32) Method


バイト シーケンスを現在の OracleLob ストリームに書き込み、書き込んだバイト数の分だけストリーム内の現在位置を進めます。Writes a sequence of bytes to the current OracleLob stream, and advances the current position within this stream by the number of bytes written.

 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)



バイト配列。An array of bytes. このメソッドは、count から現在のストリームに、buffer で指定されたバイト数だけコピーします。This method copies the number of bytes specified in count from buffer to the current stream.

Int32 Int32 Int32 Int32

現在のストリームへのバイトのコピーを開始する位置を示す buffer 内のバイト オフセット。インデックス番号は 0 から始まります。The zero-based byte offset in buffer at which to begin copying bytes to the current stream. CLOB 型および NCLOB 型の場合、これは偶数である必要があります。For CLOB and NCLOB data types, this must be an even number.

Int32 Int32 Int32 Int32

現在のストリームに書き込むバイト数。The number of bytes to be written to the current stream. CLOB 型および NCLOB 型の場合、これは偶数である必要があります。For CLOB and NCLOB data types, this must be an even number.


buffer パラメーターが null 参照 (Visual Basic の場合は Nothing) です。The buffer parameter is a null reference (Nothing in Visual Basic).

offset パラメーターまたは count パラメーターの値が正の値ではありません。A value in the offset or count parameter is not positive.

または-or- offset パラメーターと count パラメーターの合計値が、buffer の長さを超えています。The sum of the offset and count parameters is larger than the buffer length.

- または --or- count パラメーターまたは offset パラメーターに指定された値が 0 より小さいか、4 GB を超えています。A value specified in the count or offset parameter is less than zero or greater than 4 gigabytes.

- または --or- CLOB および NCLOB データ型には、偶数のバイト数を指定する必要があります。You must specify CLOB and NCLOB data types as an even number of bytes.

操作がトランザクション内で実行されていないか、OracleLob オブジェクトが null か、または接続が閉じられています。The operation is not within a transaction, the OracleLob object is null, or the connection is closed.

オブジェクトが閉じられているか、破棄されています。The object was closed or disposed.

Oracle エラーが発生しました。An Oracle error has occurred.


書き込み操作が成功した場合、ストリーム内の位置は、書き込まれたバイト数だけ進みます。If the write operation is successful, the position within the stream advances by the number of bytes written. 例外が発生した場合、ストリーム内の位置は変更されません。If an exception occurs, the position within the stream remains unchanged.

LOB末尾を超えた書き込みが許可されLOB 、書き込まれたバイト数だけを拡大します。Writing beyond the end of LOB is allowed and enlarges the LOB by the number of bytes written.

Oracle 用の .NET Framework Data Provider は、 CLOBすべてNCLOBのおよびデータを Unicode として処理します。The .NET Framework Data Provider for Oracle handles all CLOB and NCLOB data as Unicode. したがって、データCLOBNCLOBおよびデータ型にアクセスする場合は、常にバイト数を処理します。各文字は2バイトです。Therefore, when accessing CLOB and NCLOB data types, you are always dealing with the number of bytes, where each character is 2 bytes. たとえば、3つの文字を含むテキストの文字列が Oracle サーバー NCLOBのとして保存されていて、文字セットが1文字に4バイトで、 Write操作を実行する場合、文字列の長さを6バイトに指定しますが、サーバーに12バイトとして格納されます。For example, if a string of text containing three characters is saved as an NCLOB on an Oracle server where the character set is 4 bytes per character, and you perform a Write operation, you specify the length of the string as 6 bytes, although it is stored as 12 bytes on the server.

LOB書き込むには、SQL SELECT ステートメントで FOR LOB UPDATE 句を使用してを取得しておく必要があります。また、ローカルトランザクションを開始する必要があります。To write to the LOB, you must have retrieved the LOB using the FOR UPDATE clause in the SQL SELECT statement, and you must have a local transaction started.

次C#の例は、オブジェクトにOracleLob書き込む方法を示しています。The following C# example demonstrates how to write to OracleLob objects.

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();  
      //Obtain the first row of data.  
      //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).  
      byte[] 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.  


読み取りLOB専用への書き込み操作は成功する可能性がありますが、サーバー LOB上のは更新されません。A write operation to a read-only LOB might succeed, but does not update the LOB on the server. ただし、この場合、のLOBローカルコピーは更新されます。In this case, however, the local copy of the LOB is updated. そのため、後でOracleLobオブジェクトに対して読み取り操作を実行すると、書き込み操作の結果が返される可能性があります。Therefore, later read operations on the OracleLob object might return the results of the write operation.