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

Definizione

Scrive una sequenza di byte nel flusso corrente OracleLob e sposta in avanti la posizione corrente all'interno del flusso in base al numero di byte scritti.

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)

Parametri

buffer
Byte[]

Matrice di byte. Questo metodo copia il numero di byte specificato in count da buffer al flusso corrente.

offset
Int32

Offset dei byte in base zero in in buffer corrispondenza del quale iniziare a copiare i byte nel flusso corrente. Per CLOB i tipi di dati e NCLOB , questo deve essere un numero pari.

count
Int32

Numero di byte da scrivere nel flusso corrente. Per CLOB i tipi di dati e NCLOB , questo deve essere un numero pari.

Eccezioni

Il parametro buffer è un riferimento Null (Nothing in Visual Basic).

Un valore nel offset parametro o count non è positivo.

oppure

La somma dei offset parametri e count è maggiore della buffer lunghezza.

oppure

Un valore specificato nel count parametro o offset è minore di zero o maggiore di 4 gigabyte.

oppure

È necessario specificare e CLOB i NCLOB tipi di dati come numero pari di byte.

L'operazione non si trova all'interno di una transazione, l'oggetto OracleLob è Null o la connessione viene chiusa.

L'oggetto è stato chiuso o eliminato.

Si è verificato un errore Oracle.

Commenti

Se l'operazione di scrittura ha esito positivo, la posizione all'interno del flusso avanza in base al numero di byte scritti. Se si verifica un'eccezione, la posizione all'interno del flusso rimane invariata.

La scrittura oltre la fine di LOB è consentita e ingrandisce in base al LOB numero di byte scritti.

Il provider di dati di .NET Framework per Oracle gestisce tutti i dati CLOB e NCLOB come Unicode. Pertanto, quando si accede ai CLOB tipi di dati e NCLOB , si ha sempre a che fare con il numero di byte, in cui ogni carattere è di 2 byte. Ad esempio, se una stringa di testo contenente tre caratteri viene salvata come in NCLOB un server Oracle in cui il set di caratteri è di 4 byte per carattere e si esegue un'operazione Write , si specifica la lunghezza della stringa come 6 byte, sebbene sia archiviata come 12 byte nel server.

Per scrivere in LOB, è necessario aver recuperato LOB utilizzando la clausola FOR UPDATE nell'istruzione SQL SELECT ed è necessario che sia stata avviata una transazione locale.

Nell'esempio seguente viene illustrato come scrivere in OracleLob oggetti :

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

Note

Un'operazione di scrittura in un'operazione di sola LOB lettura potrebbe avere esito positivo, ma non aggiorna nel LOB server. In questo caso, tuttavia, la copia locale di LOB viene aggiornata. Pertanto, le operazioni di lettura successive sull'oggetto OracleLob potrebbero restituire i risultati dell'operazione di scrittura.

Si applica a