OracleLob.Read(Byte[], Int32, Int32) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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 bajtu na podstawie zera, w buffer którym należy rozpocząć przechowywanie danych odczytanych z bieżącego strumienia. 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ć mniejsza niż liczba bajtów żądanych, jeśli liczba bajtów nie jest obecnie dostępna lub zero (0), jeśli osiągnięto koniec strumienia.
Wyjątki
buffer jest odwołaniem 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 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 count bajty z bieżącego strumienia i zapisuje je na buffer początku na offset. Bieżące położenie w strumieniu jest zaawansowane przez liczbę odczytanych bajtów; jednak w przypadku wystąpienia wyjątku bieżąca pozycja w strumieniu pozostaje niezmieniona.
Read Zwraca liczbę odczytanych bajtów. Wartość zwracana jest równa zero tylko wtedy, gdy pozycja znajduje się obecnie na końcu strumienia.
Read zablokuje co najmniej jeden bajt danych w przypadku, gdy żadne dane nie są dostępne.Read Zwraca wartość 0, jeśli próbujesz odczytać z elementu LOB , gdy bieżąca pozycja znajduje się na końcu LOBelementu .
Read może zwrócić mniej bajtów niż żądano, nawet jeśli koniec strumienia nie został osiągnięty.
Program .NET Framework Dostawca danych for Oracle obsługuje wszystkie dane CLOB i NCLOB jako dane Unicode. W związku z tym podczas uzyskiwania CLOB dostępu i NCLOB typów danych zawsze masz do czynienia z liczbą bajtów, gdzie każdy znak ma 2 bajty. Jeśli na przykład ciąg tekstowy zawierający trzy znaki jest zapisywany jako obiekt NCLOB na 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żesz utworzyć obiekt o wartości NULL, używając następującego OracleLob 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.