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

Definição

Escreve uma sequência de bytes no fluxo atual OracleLob e avança a posição atual dentro desse fluxo pelo número de bytes escritos.

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[]

Um conjunto de bytes. Este 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 que se deve começar a copiar bytes para o fluxo atual. Para CLOB os tipos de dados e, NCLOB este deve ser um número par.

count
Int32

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

Exceções

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

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

-ou-

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

-ou-

Um valor especificado no count parâmetro ou offset é inferior a zero ou superior a 4 gigabytes.

-ou-

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

A operação não está dentro de uma transação, o OracleLob objeto é nulo ou a ligação está fechada.

O objeto foi fechado ou descartado.

Ocorreu um erro da Oracle.

Observações

Se a operação de escrita for bem-sucedida, a posição dentro do fluxo avança pelo número de bytes escritos. Se ocorrer uma exceção, a posição dentro do fluxo mantém-se inalterada.

A escrita para além do final de LOB é permitida e aumenta o LOB pelo número de bytes escritos.

O Data Provider do .NET Framework para Oracle trata todos os dados CLOB e NCLOB como Unicode. Portanto, ao aceder CLOB a tipos de dados, NCLOB está sempre a lidar com o número de bytes, onde cada carácter tem 2 bytes. Por exemplo, se uma cadeia de texto contendo três caracteres for guardada num NCLOB servidor Oracle onde o conjunto de caracteres é de 4 bytes por carácter, e realizar uma Write operação, especifica o comprimento da cadeia como 6 bytes, embora esteja armazenada como 12 bytes no servidor.

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

O exemplo seguinte demonstra como escrever em OracleLob 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();
    }
}

Note

Uma operação de escrita para só LOB leitura pode ter sucesso, mas não atualiza o LOB no servidor. Neste caso, no entanto, a cópia local do LOB é atualizada. Portanto, operações de leitura posteriores no OracleLob objeto podem devolver os resultados da operação de escrita.

Aplica-se a