Share via


OracleLob.Read(Byte[], Int32, Int32) Metoda

Definice

Přečte posloupnost bajtů z aktuálního OracleLob datového proudu a posune pozici v rámci streamu o počet přečtených bajtů.

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

Parametry

buffer
Byte[]

Pole bajtů. Když se tato metoda vrátí, vyrovnávací paměť obsahuje zadané pole bajtů s hodnotami mezi offset a (offset + count) nahrazené bajty načtenými z aktuálního zdroje.

offset
Int32

Nulový odsazení bajtů, při buffer kterém se mají začít ukládat data načtená z aktuálního datového proudu. U CLOB datových typů a NCLOB musí jít o sudé číslo.

count
Int32

Maximální počet bajtů, které se mají načíst z aktuálního datového proudu. U CLOB datových typů a NCLOB musí jít o sudé číslo.

Návraty

Celkový počet bajtů načtených do vyrovnávací paměti. To může být menší než počet požadovaných bajtů, pokud tento počet bajtů není aktuálně k dispozici, nebo nula (0), pokud bylo dosaženo konce datového proudu.

Výjimky

The buffer is a null reference (Nothing in Visual Basic).

Hodnota v parametru offset nebo count není kladná.

-nebo-

Součet parametrů posunu a počtu je větší než délka vyrovnávací paměti.

-nebo-

Hodnota zadaná v parametru amount nebo offset je menší než nula nebo větší než 4 gigabajty.

Operace není v rámci transakce, OracleLob objekt má hodnotu null nebo je připojení uzavřeno.

Objekt byl uzavřen nebo odstraněn.

Došlo k chybě Oracle.

Poznámky

Metoda Read načte maximální počet bajtů z aktuálního count datového proudu a uloží je na buffer začátku od offset. Aktuální pozice v rámci streamu je rozšířena o počet přečtených bajtů; Pokud však dojde k výjimce, aktuální pozice v rámci datového proudu zůstane beze změny. Read vrátí počet přečtených bajtů. Návratová hodnota je nula pouze v případě, že je pozice aktuálně na konci datového proudu. Readbude blokovat, dokud nebude možné číst alespoň jeden bajt dat v případě, že nejsou k dispozici žádná data.Read vrátí hodnotu 0, pokud se pokusíte přečíst z parametruLOB, když je aktuální pozice na konci .LOB Read může vrátit méně bajtů, než je požadováno, i když nebylo dosaženo konce datového proudu.

Zprostředkovatel dat rozhraní .NET Framework pro Oracle zpracovává všechna CLOB data a NCLOB jako Unicode. Proto při přístupu k datovým typům CLOB a NCLOB datovým typům vždy pracujete s počtem bajtů, kde každý znak má 2 bajty. Pokud je například řetězec textu obsahující tři znaky uložen jako NCLOB řetězec na serveru Oracle, kde je znaková sada 4 bajty na znak, a provedete Read operaci, zadáte délku řetězce jako 6 bajtů, i když je na serveru uložen jako 12 bajtů.

Následující příklad ukazuje, jak číst OracleLob objekty.

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);  
    }  
}  

Pomocí tohoto formátu můžete vytvořit OracleLob objekt s hodnotou NULL:

OracleLob myLob = OracleLob.Null;  

Tato technika se používá především k otestování, jestli LOB má vrácené ze serveru hodnotu NULL, jak je znázorněno v následujícím příkladu.

if (myLob == OracleLob.Null)  

Hodnota NULL LOB se chová podobně jako nulový bajt LOB , který Read je úspěšný a vždy vrací nula bajtů.

Platí pro