Freigeben über


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

Definition

Schreibt eine Folge von Bytes in den aktuellen OracleLob-Stream und verschiebt die aktuelle Position in diesem Stream um die Anzahl der geschrieben Bytes nach vorn.

public:
 override void Write(cli::array <System::Byte> ^ buffer, int offset, int count);
public override void Write (byte[] buffer, int offset, int count);
override this.Write : byte[] * int * int -> unit
Public Overrides Sub Write (buffer As Byte(), offset As Integer, count As Integer)

Parameter

buffer
Byte[]

Ein Bytearray. Diese Methode kopiert die in count angegebene Anzahl von Bytes aus dem buffer in den aktuellen Stream.

offset
Int32

Der nullbasierte Byteoffset im buffer, ab dem Bytes in den aktuellen Stream kopiert werden. Bei CLOB-Datentypen und NCLOB-Datentypen muss dies eine gerade Zahl sein.

count
Int32

Die Anzahl an Bytes, die in den aktuellen Stream geschrieben werden sollen. Bei CLOB-Datentypen und NCLOB-Datentypen muss dies eine gerade Zahl sein.

Ausnahmen

Der buffer-Parameter ist ein NULL-Verweis (Nothing in Visual Basic).

Ein im offset-Parameter oder im count-Parameter angegebener Wert ist nicht positiv.

- oder -

Die Summe des offset-Parameters und des count-Parameters ist größer als die buffer-Länge.

- oder -

Ein im count-Parameter oder im offset-Parameter angegebener Wert ist kleiner als 0 (null) oder größer als 4 Gigabyte.

- oder -

Sie müssen CLOB-Datentypen und NCLOB-Datentypen als gerade Anzahl von Bytes angeben.

Die Operation befindet sich nicht innerhalb einer Transaktion, das OracleLob-Objekt ist NULL, oder die Verbindung ist geschlossen.

Das Objekt war geschlossen oder freigegeben.

Es ist ein Oracle-Fehler aufgetreten.

Hinweise

Wenn der Schreibvorgang erfolgreich ist, wird die Position innerhalb des Datenstroms um die Anzahl der geschriebenen Bytes erhöht. Wenn eine Ausnahme auftritt, bleibt die Position im Stream unverändert.

Das Schreiben über das Ende von LOB hinaus ist zulässig und vergrößert den LOB um die Anzahl der geschriebenen Bytes.

Der .NET Framework-Datenanbieter für Oracle verarbeitet alle CLOB Daten und NCLOB daten als Unicode. Daher haben Sie beim Zugriff auf CLOB und NCLOB Datentypen immer mit der Anzahl von Bytes zu tun, wobei jedes Zeichen 2 Bytes ist. Wenn beispielsweise eine Textzeichenfolge mit drei Zeichen als eine NCLOB auf einem Oracle-Server gespeichert wird, auf dem der Zeichensatz 4 Bytes pro Zeichen ist, und Sie einen Write Vorgang ausführen, geben Sie die Länge der Zeichenfolge als 6 Bytes an, obwohl sie als 12 Bytes auf dem Server gespeichert wird.

Um in den zu LOBschreiben, müssen Sie die LOB mithilfe der FOR UPDATE-Klausel in der SQL SELECT-Anweisung abgerufen haben, und Sie müssen eine lokale Transaktion gestartet haben.

Im folgenden Beispiel wird veranschaulicht, wie in Objekte geschrieben wird OracleLob :

public static void WriteLobExample(OracleCommand command)  
{  
    // Note: Updating LOB data requires a transaction.  
    command.Transaction = command.Connection.BeginTransaction();  
    // Select some data.  
    //    Table Schema:  
    //        "CREATE TABLE tablewithlobs (a int, b BLOB, c BLOB)";  
    //        "INSERT INTO tablewithlobs values (1, 'AA', 'AAA')";  
    command.CommandText = "SELECT * FROM TableWithLobs FOR UPDATE";  
    OracleDataReader reader = command.ExecuteReader();  
    using(reader)  
    {  
        // Obtain the first row of data.  
        reader.Read();  
        // Obtain both LOBs.  
        OracleLob BLOB1 = reader.GetOracleLob(1);  
        OracleLob BLOB2 = reader.GetOracleLob(2);  
        // Perform any desired operations on the LOB, (read, position, and so on).  
        // ...  
        // Example - Writing binary data (directly to the backend).  
        // To write, you can use any of the stream classes, or write raw binary data using   
        // the OracleLob write method. Writing character vs. binary is the same;  
        // however note that character is always in terms of Unicode byte counts  
        // (for example: even number of bytes - 2 bytes for every Unicode character).  
        var buffer = new byte[100];  
        buffer[0] = 0xCC;  
        buffer[1] = 0xDD;  
        BLOB1.Write(buffer, 0, 2);  
        BLOB1.Position = 0;  
        Console.WriteLine(BLOB1.LobType + ".Write(" + buffer + ", 0, 2) => " + BLOB1.Value);  

        // Example - Copying data into another LOB.  
        long actual = BLOB1.CopyTo(BLOB2);  
        Console.WriteLine(BLOB1.LobType + ".CopyTo(" + BLOB2.Value + ") => " + actual);  

        // Commit the transaction now that everything succeeded.  
        // Note: On error, Transaction.Dispose is called (from the using statement)  
        // and will automatically roll-back the pending transaction.  
        command.Transaction.Commit();  
    }  
}  

Hinweis

Ein Schreibvorgang für einen schreibgeschützten LOB Vorgang kann erfolgreich sein, aktualisiert aber nicht den LOB auf dem Server. In diesem Fall wird jedoch die lokale Kopie des LOB aktualisiert. Daher können spätere Lesevorgänge für das OracleLob Objekt die Ergebnisse des Schreibvorgangs zurückgeben.

Gilt für: