OracleLob.Read(Byte[], Int32, Int32) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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ů.