Udostępnij za pośrednictwem


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

Definicja

Odczytuje sekwencję bajtów z bieżącego OracleLob strumienia i rozwija pozycję w strumieniu według liczby odczytanych bajtów.

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[]

Tablica bajtów. Gdy ta metoda zwraca, bufor zawiera określoną tablicę bajtów z wartościami między offset i (offset + count) zastąpionymi bajtami odczytanymi z bieżącego źródła.

offset
Int32

Przesunięcie bajtów na podstawie zera, w buffer którym rozpocznie się przechowywanie danych odczytanych ze strumienia bieżącego. W przypadku CLOB typów danych i NCLOB musi to być liczba parzysta.

count
Int32

Maksymalna liczba bajtów do odczytu z bieżącego strumienia. W przypadku CLOB typów danych i NCLOB musi to być liczba parzysta.

Zwraca

Całkowita liczba bajtów odczytanych do buforu. Może to być mniej niż liczba bajtów żądanych, jeśli liczba bajtów jest obecnie niedostępna lub zero (0), jeśli osiągnięto koniec strumienia.

Wyjątki

Jest buffer to odwołanie o wartości null (Nothing w Visual Basic).

Wartość w parametrze offset or count nie jest dodatnia.

-lub-

Suma parametrów przesunięcia i liczby jest większa niż długość buforu.

-lub-

Wartość określona w parametrze amount or offset jest mniejsza niż zero lub większa niż 4 gigabajty.

Operacja nie znajduje się w transakcji, OracleLob obiekt ma wartość null lub połączenie jest zamknięte.

Obiekt został zamknięty lub usunięty.

Wystąpił błąd Oracle.

Uwagi

Metoda Read odczytuje maksymalnie bajty count z bieżącego strumienia i przechowuje je na buffer początku na offset. Bieżąca pozycja w strumieniu jest zaawansowana przez liczbę odczytanych bajtów; jeśli jednak wystąpi wyjątek, bieżąca pozycja w strumieniu pozostaje niezmieniona. Read zwraca liczbę odczytanych bajtów. Wartość zwracana jest zero tylko wtedy, gdy pozycja znajduje się obecnie na końcu strumienia. Readspowoduje zablokowanie co najmniej jednego bajtu danych w przypadku, gdy żadne dane nie są dostępne.Read Zwraca wartość 0, jeśli próbujesz odczytać z wartości, LOB gdy bieżąca pozycja znajduje się na końcu .LOB Read może zwrócić mniej bajtów niż żądane, nawet jeśli koniec strumienia nie został osiągnięty.

Dostawca danych .NET Framework dla oracle obsługuje wszystkie CLOB dane i NCLOB jako Unicode. W związku z tym podczas uzyskiwania CLOB dostępu do NCLOB typów danych i zawsze masz do czynienia z liczbą bajtów, gdzie każdy znak to 2 bajty. Jeśli na przykład ciąg tekstu zawierającego trzy znaki jest zapisywany jako na NCLOB serwerze Oracle, na którym zestaw znaków wynosi 4 bajty na znak, i wykonujesz operację Read , należy określić długość ciągu jako 6 bajtów, chociaż jest on przechowywany jako 12 bajtów na serwerze.

W poniższym przykładzie pokazano, jak odczytywać OracleLob obiekty.

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

Można skonstruować wartość OracleLob NULL przy użyciu tego formatu:

OracleLob myLob = OracleLob.Null;  

Ta technika jest używana głównie do testowania, czy LOB zwrócony z serwera ma wartość NULL, jak pokazano w poniższym przykładzie.

if (myLob == OracleLob.Null)  

Wartość NULL LOB zachowuje się podobnie do bajtu LOB zerowego, który Read kończy się powodzeniem i zawsze zwraca zero bajtów.

Dotyczy