Compartilhar via


OracleLob.Write(Byte[], Int32, Int32) Método

Definição

Grava assincronamente uma sequência de bytes no fluxo OracleLob atual e avança a posição atual dentro desse fluxo no número de bytes gravados.

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)

Parâmetros

buffer
Byte[]

Uma matriz de bytes. Esse método copia o número de bytes especificado em count de buffer para o fluxo atual.

offset
Int32

O deslocamento de bytes baseado em zero em buffer no qual será iniciada a cópia de bytes no fluxo atual. Para os tipos de dados CLOB e NCLOB, isso deve ser um número par.

count
Int32

O número de bytes a serem gravados no fluxo atual. Para os tipos de dados CLOB e NCLOB, isso deve ser um número par.

Exceções

O parâmetro Nothing é uma referência nula (buffer no Visual Basic).

Um valor de parâmetro offset ou count não é positivo.

- ou -

A soma dos parâmetros offset e count é maior do que o tamanho buffer.

- ou -

Um valor especificado no parâmetro count ou offset é menor que zero ou maior que 4 gigabytes.

- ou -

Você deve especificar os tipos de dados CLOB e NCLOB como um número par de bytes.

A operação não está em uma transação, o objeto OracleLob é nulo ou a conexão é fechada.

O objeto foi fechado ou descartado.

Ocorreu um erro do Oracle.

Comentários

Se a operação de gravação for bem-sucedida, a posição dentro do fluxo avançará pelo número de bytes gravados. Se ocorrer uma exceção, a posição dentro do fluxo permanecerá inalterada.

A gravação além do final de LOB é permitida e amplia o LOB pelo número de bytes gravados.

O provedor de dados .NET Framework para Oracle manipula todos os CLOB dados e NCLOB como Unicode. Portanto, ao acessar CLOB e NCLOB tipos de dados, você está sempre lidando com o número de bytes, em que cada caractere é de 2 bytes. Por exemplo, se uma cadeia de caracteres de texto contendo três caracteres for salva como um em um NCLOB servidor Oracle em que o conjunto de caracteres é de 4 bytes por caractere e você executar uma Write operação, especifique o comprimento da cadeia de caracteres como 6 bytes, embora ela seja armazenada como 12 bytes no servidor.

Para gravar no LOB, você deve ter recuperado o usando a LOB cláusula FOR UPDATE na instrução SQL SELECT e deve ter uma transação local iniciada.

O exemplo a seguir demonstra como gravar OracleLob em objetos:

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

Observação

Uma operação de gravação em um somente LOB leitura pode ter êxito, mas não atualiza o LOB no servidor. Nesse caso, no entanto, a cópia local do LOB é atualizada. Portanto, operações de leitura posteriores no OracleLob objeto podem retornar os resultados da operação de gravação.

Aplica-se a