OracleLob.Write(Byte[], Int32, Int32) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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.