OracleLob.Write(Byte[], Int32, Int32) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Escribe una secuencia de bytes en la secuencia OracleLob actual y hace avanzar la posición actual dentro de la secuencia en el número de bytes especificado.
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[]
Matriz de bytes. Este método copia el número de bytes especificado en count
desde buffer
hasta la secuencia actual.
- offset
- Int32
Desplazamiento en bytes de base cero en buffer
desde donde se comienzan a copiar los bytes en la secuencia actual. Para los tipos de datos CLOB
y NCLOB
, debe ser un número par.
- count
- Int32
Número de bytes que se deben escribir en la secuencia actual. Para los tipos de datos CLOB
y NCLOB
, debe ser un número par.
Excepciones
El parámetro buffer
es una referencia nula (Nothing
en Visual Basic).
Un valor del parámetro offset
o count
no es positivo.
o bien
La suma de los parámetros offset
y count
es mayor que la longitud de buffer
.
o bien
Un valor especificado en el parámetro count
u offset
es menor que cero o mayor que 4 gigabytes.
o bien
Debe especificar los tipos de datos CLOB
y NCLOB
como un número par de bytes.
La operación no está dentro de una transacción, el objeto OracleLob es null, o la conexión está cerrada.
El objeto estaba cerrado o desechado.
Se produjo un error de Oracle.
Comentarios
Si la operación de escritura se realiza correctamente, la posición dentro de la secuencia avanza por el número de bytes escritos. Si se produce una excepción, la posición dentro de la secuencia permanece sin cambios.
Se permite escribir más allá del final de LOB
y amplía LOB
el por el número de bytes escritos.
El proveedor de datos de .NET Framework para Oracle controla todos los CLOB
datos y NCLOB
como Unicode. Por lo tanto, al acceder a CLOB
los tipos de datos y NCLOB
, siempre se trata del número de bytes, donde cada carácter es de 2 bytes. Por ejemplo, si se guarda una cadena de texto que contiene tres caracteres como en un NCLOB
servidor oracle donde el juego de caracteres es de 4 bytes por carácter y se realiza una Write
operación, se especifica la longitud de la cadena como 6 bytes, aunque se almacena como 12 bytes en el servidor.
Para escribir en LOB
, debe haber recuperado mediante LOB
la cláusula FOR UPDATE en la instrucción SQL SELECT y debe haber iniciado una transacción local.
En el ejemplo siguiente se muestra cómo escribir OracleLob en 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();
}
}
Nota
Una operación de escritura en un solo LOB
lectura podría realizarse correctamente, pero no actualiza en LOB
el servidor. Sin embargo, en este caso, se actualiza la copia local de .LOB
Por lo tanto, las operaciones de lectura posteriores en el OracleLob objeto podrían devolver los resultados de la operación de escritura.