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 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.