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, erhöht sich die Position im Stream um die Anzahl der geschriebenen Bytes. Wenn eine Ausnahme auftritt, bleibt die Position innerhalb des Streams unverändert.

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

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

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

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

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 in einen schreibgeschützten LOB kann erfolgreich sein, aktualisiert aber nicht LOB auf dem Server. In diesem Fall wird jedoch die lokale Kopie von LOB aktualisiert. Daher können spätere Lesevorgänge für das OracleLob Objekt die Ergebnisse des Schreibvorgangs zurückgeben.

Gilt für: