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

定義

現在の OracleLob ストリームからバイト シーケンスを読み取り、読み取ったバイト数の分だけストリーム内の位置を進めます。

public:
 override int Read(cli::array <System::Byte> ^ buffer, int offset, int count);
public override int Read (byte[] buffer, int offset, int count);
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer

パラメーター

buffer
Byte[]

バイト配列。 このメソッドが戻るとき、指定したバイト配列の offset から (offset + count) までの値が、現在のソースから読み取られたバイトに置き換えられて含まれます。

offset
Int32

現在のストリームから読み取ったデータの格納を開始する位置を示す buffer 内のバイト オフセット。インデックス番号は 0 から始まります。 CLOB 型および NCLOB 型の場合、これは偶数である必要があります。

count
Int32

現在のストリームから読み取る最大バイト数。 CLOB 型および NCLOB 型の場合、これは偶数である必要があります。

戻り値

バッファーに読み取られた合計バイト数。 要求しただけのバイト数を読み取ることができなかった場合、この値は要求したバイト数より小さくなります。ストリームの末尾に到達した場合は 0 になることがあります。

例外

buffer が null 参照 (Visual Basic の場合は Nothing) です。

offset パラメーターまたは count パラメーターの値が正の値ではありません。

- または -

オフセット パラメーターとカウント パラメーターの合計値が、バッファー長を超えています。

- または -

amount パラメーターまたは offset パラメーターに指定された値が 0 より小さいか、4 GB を超えています。

操作がトランザクション内で実行されていないか、OracleLob オブジェクトが null か、または接続が閉じられています。

オブジェクトが閉じられているか、破棄されています。

Oracle エラーが発生しました。

注釈

メソッドはRead、現在のcountストリームから最大バイト数を読み取り、 でoffset始まるにbuffer格納します。 ストリーム内の現在の位置は、読み取られたバイト数だけ進みます。ただし、例外が発生した場合、ストリーム内の現在の位置は変更されません。 Read は読み取られたバイト数を返します。 位置が現在ストリームの末尾にある場合にのみ、戻り値は 0 です。 Readは、データが使用できない場合に、少なくとも 1 バイトのデータを読み取ることができるまでブロックします。Read現在の位置が の末尾LOBにあるときに からLOB読み取ろうとすると、 は 0 を返します。 Read は、ストリームの末尾に達していない場合でも、要求されたバイト数よりも少ないバイト数を返すことができます。

.NET Framework Data Provider for Oracle は、すべてのCLOBデータとデータを NCLOB Unicode として処理します。 したがって、および NCLOB データ型にアクセスするCLOB場合は、常にバイト数を処理します。各文字は 2 バイトです。 たとえば、3 文字を含むテキストの文字列が、1 文字あたり 4 バイトの Oracle サーバーに として NCLOB 保存され、操作を実行 Read する場合は、サーバーに 12 バイトとして格納されますが、文字列の長さは 6 バイトとして指定します。

次の例では、オブジェクトを読み取 OracleLob る方法を示します。

public static void ReadLobExample(OracleCommand command)  
{  
    int actual = 0;  

    // Select some data.  
    // Table Schema:  
    //  "CREATE TABLE TableWithLobs (a int, b BLOB, c CLOB, d NCLOB)";  
    //  "INSERT INTO TableWithLobs values (1, 'AA', 'AAA', N'AAAA')";  
    command.CommandText = "SELECT * FROM TableWithLobs";  
    OracleDataReader reader = command.ExecuteReader();  
    using(reader)  
    {  
        // Obtain the first row of data.  
        reader.Read();  
        // Obtain the LOBs (all 3 varieties).  
        OracleLob BLOB = reader.GetOracleLob(1);  
        OracleLob CLOB  = reader.GetOracleLob(2);  
        OracleLob NCLOB = reader.GetOracleLob(3);  

        // Example - Reading binary data (in chunks).  
        var buffer = new byte[100];  
        while((actual = BLOB.Read(buffer, 0, buffer.Length)) > 0)  
            Console.WriteLine(BLOB.LobType + ".Read(" + buffer + ", " + buffer.Length + ") => " + actual);  

        // Example - Reading CLOB/NCLOB data (in chunks).  
        // Note: You can read character data as raw Unicode bytes (using OracleLob.Read as in the above example).  
        // However, because the OracleLob object inherits directly from the.NET stream object,   
        // all the existing classes that manipulate streams can also be used. For example, the   
        // .NET StreamReader makes converting the raw bytes into actual characters easier.  
        var streamreader = new StreamReader(CLOB, Encoding.Unicode);  
        var cbuffer = new char[100];  
        while((actual = streamreader.Read(cbuffer, 0, cbuffer.Length)) >0)  
            Console.WriteLine(CLOB.LobType + ".Read(" + new string(cbuffer, 0, actual) + ", " + cbuffer.Length + ") => " + actual);  

        //Example - Reading data (all at once).  
        //You could use StreamReader.ReadToEnd to obtain all the string data,or simply  
        //call OracleLob.Value to obtain a contiguous allocation of all the data.  
        Console.WriteLine(NCLOB.LobType + ".Value => " + NCLOB.Value);  
    }  
}  

次の形式を使用して、NULL である を OracleLob 構築できます。

OracleLob myLob = OracleLob.Null;  

この手法は、主に、次の例に示すように、サーバーから返される が NULL かどうかを LOB テストするために使用されます。

if (myLob == OracleLob.Null)  

NULL LOB は、 で成功し、常に 0 バイトを返す Read 0 バイトLOBと同様に動作します。

適用対象