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

Definitie

Hiermee wordt een reeks bytes uit de huidige OracleLob stroom gelezen en wordt de positie binnen de stream verplaatst door het aantal bytes dat is gelezen.

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

Parameters

buffer
Byte[]

Een matrix van bytes. Wanneer deze methode wordt geretourneerd, bevat de buffer de opgegeven bytematrix door de waarden tussen offset en (offset + count) vervangen door de bytes die zijn gelezen uit de huidige bron.

offset
Int32

De byte-offset buffer op basis van nul waarin de gegevens worden opgeslagen die uit de huidige stroom worden gelezen. Voor CLOB en NCLOB gegevenstypen moet dit een even getal zijn.

count
Int32

Het maximum aantal bytes dat moet worden gelezen uit de huidige stream. Voor CLOB en NCLOB gegevenstypen moet dit een even getal zijn.

Retouren

Het totale aantal bytes dat in de buffer is gelezen. Dit kan kleiner zijn dan het aantal aangevraagde bytes als er momenteel niet veel bytes beschikbaar zijn, of nul (0) als het einde van de stream is bereikt.

Uitzonderingen

De buffer is een null-verwijzing (Nothing in Visual Basic).

Een waarde in de offset of count parameter is niet positief.

– of –

De som van de offset- en tellingsparameters is groter dan de bufferlengte.

– of –

Een waarde die is opgegeven in de offset parameter is kleiner dan nul of groter dan 4 gigabyte.

De bewerking bevindt zich niet binnen een transactie, het OracleLob object is null of de verbinding is gesloten.

Het object is gesloten of verwijderd.

Er is een Oracle-fout opgetreden.

Opmerkingen

De Read methode leest maximaal bytes uit count de huidige stroom en slaat deze op buffervanaf offset . De huidige positie in de stream wordt geavanceerd door het aantal gelezen bytes; Als er echter een uitzondering optreedt, blijft de huidige positie binnen de stroom ongewijzigd. Read retourneert het aantal bytes dat wordt gelezen. De retourwaarde is alleen nul als de positie zich momenteel aan het einde van de stream bevindt. Read wordt geblokkeerd totdat ten minste één byte aan gegevens kan worden gelezen, in het geval dat er geen gegevens beschikbaar zijn.Read retourneert 0 als u probeert te lezen vanaf een LOB wanneer de huidige positie zich aan het einde van LOB. Read kan minder bytes retourneren dan aangevraagd, zelfs als het einde van de stream niet is bereikt.

De .NET Framework-Data Provider voor Oracle verwerkt alle CLOB en NCLOB-gegevens als Unicode. Daarom hebt u bij het openen CLOB en NCLOB gegevenstypen altijd te maken met het aantal bytes, waarbij elk teken 2 bytes is. Als een tekenreeks met drie tekens bijvoorbeeld wordt opgeslagen als een NCLOB Oracle-server waarop de tekenset 4 bytes per teken is en u een Read bewerking uitvoert, geeft u de lengte van de tekenreeks op als 6 bytes, hoewel deze is opgeslagen als 12 bytes op de server.

In het volgende voorbeeld ziet u hoe u objecten kunt lezen OracleLob .

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

U kunt een null OracleLob maken met behulp van deze indeling:

OracleLob myLob = OracleLob.Null;

Deze techniek wordt voornamelijk gebruikt om te testen of een LOB geretourneerde server NULL is, zoals in het volgende voorbeeld wordt geïllustreerd.

if (myLob == OracleLob.Null)

Een NULL LOB gedraagt zich op dezelfde manier als een nul-byte LOB in die Read slaagt en retourneert altijd nul bytes.

Van toepassing op