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 から始まるバイト オフセット。 CLOBNCLOBのデータ型の場合、これは偶数である必要があります。

count
Int32

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

返品

バッファーに読み込まれるバイトの合計数。 この値は、現在使用できないバイト数が要求されたバイト数より少ない場合があります。ストリームの末尾に達した場合は 0 になります。

例外

buffer は null 参照 (Visual Basic では Nothing) です。

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

-又は-

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

-又は-

offset パラメーターで指定された値が 0 未満か、4 ギガバイトを超える値です。

操作がトランザクション内にありません。 OracleLob オブジェクトが null であるか、接続が閉じられています。

オブジェクトが閉じられたか、破棄されました。

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

注釈

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

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

次の例では、 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;

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

if (myLob == OracleLob.Null)

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

適用対象