OracleLob.Read(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í.
Lee una secuencia de bytes de la secuencia actual OracleLob y avanza la posición dentro de la secuencia por el número de bytes leídos.
public:
override int Read(cli::array <System::Byte> ^ buffer, int offset, int count);
public override int Read(byte[] buffer, int offset, int count);
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer
Parámetros
- buffer
- Byte[]
Matriz de bytes. Cuando este método devuelve, el búfer contiene la matriz de bytes especificada con los valores entre offset y (offset + count) reemplazados por los bytes leídos del origen actual.
- offset
- Int32
Desplazamiento de bytes de base cero en el buffer que se van a empezar a almacenar los datos leídos de la secuencia actual. Para CLOB los tipos de datos y NCLOB , debe ser un número par.
- count
- Int32
Número máximo de bytes que se van a leer desde la secuencia actual. Para CLOB los tipos de datos y NCLOB , debe ser un número par.
Devoluciones
Número total de bytes leídos en el búfer. Puede ser menor que el número de bytes solicitados si no hay muchos bytes disponibles actualmente o cero (0) si se ha alcanzado el final de la secuencia.
Excepciones
El buffer es una referencia nula (Nothing en Visual Basic).
Un valor del offset parámetro o count no es positivo.
O bien
La suma de los parámetros offset y count es mayor que la longitud del búfer.
O bien
Un valor especificado en el offset parámetro es menor que cero o mayor que 4 gigabytes.
La operación no está dentro de una transacción, el OracleLob objeto es null o se cierra la conexión.
El objeto se cerró o se ha eliminado.
Se ha producido un error de Oracle.
Comentarios
El Read método lee un máximo de count bytes de la secuencia actual y los almacena a partir de bufferoffset. La posición actual dentro de la secuencia está avanzada por el número de bytes leídos; sin embargo, si se produce una excepción, la posición actual dentro de la secuencia permanece sin cambios.
Read devuelve el número de bytes leídos. El valor devuelto es cero solo si la posición está actualmente al final de la secuencia.
Read se bloqueará hasta que se pueda leer al menos un byte de datos, en caso de que no haya datos disponibles.Read devuelve 0 si intenta leer desde cuando LOB la posición actual está al final de LOB.
Read puede devolver menos bytes de los solicitados incluso si no se ha alcanzado el final de la secuencia.
El Proveedor de datos de .NET Framework para Oracle controla todos los datos /CLOB y NCLOB como Unicode. Por lo tanto, al acceder a CLOB los tipos de datos y NCLOB , siempre se trabaja con el número de bytes, donde cada carácter es de 2 bytes. Por ejemplo, si una cadena de texto que contiene tres caracteres se guarda como en NCLOB un servidor oracle donde el juego de caracteres es de 4 bytes por carácter y realiza una Read operación, se especifica la longitud de la cadena como 6 bytes, aunque se almacena como 12 bytes en el servidor.
En el ejemplo siguiente se muestra cómo leer OracleLob objetos.
public static void ReadLobExample(OracleCommand command)
{
int actual = 0;
// Select some data.
// Table Schema:
// "CREATE TABLE TableWithLobs (a int, b BLOB, c CLOB, d NCLOB)";
// "INSERT INTO TableWithLobs values (1, 'AA', 'AAA', N'AAAA')";
command.CommandText = "SELECT * FROM TableWithLobs";
OracleDataReader reader = command.ExecuteReader();
using(reader)
{
// Obtain the first row of data.
reader.Read();
// Obtain the LOBs (all 3 varieties).
OracleLob BLOB = reader.GetOracleLob(1);
OracleLob CLOB = reader.GetOracleLob(2);
OracleLob NCLOB = reader.GetOracleLob(3);
// Example - Reading binary data (in chunks).
var buffer = new byte[100];
while((actual = BLOB.Read(buffer, 0, buffer.Length)) > 0)
Console.WriteLine(BLOB.LobType + ".Read(" + buffer + ", " + buffer.Length + ") => " + actual);
// Example - Reading CLOB/NCLOB data (in chunks).
// Note: You can read character data as raw Unicode bytes (using OracleLob.Read as in the above example).
// However, because the OracleLob object inherits directly from the.NET stream object,
// all the existing classes that manipulate streams can also be used. For example, the
// .NET StreamReader makes converting the raw bytes into actual characters easier.
var streamreader = new StreamReader(CLOB, Encoding.Unicode);
var cbuffer = new char[100];
while((actual = streamreader.Read(cbuffer, 0, cbuffer.Length)) >0)
Console.WriteLine(CLOB.LobType + ".Read(" + new string(cbuffer, 0, actual) + ", " + cbuffer.Length + ") => " + actual);
//Example - Reading data (all at once).
//You could use StreamReader.ReadToEnd to obtain all the string data,or simply
//call OracleLob.Value to obtain a contiguous allocation of all the data.
Console.WriteLine(NCLOB.LobType + ".Value => " + NCLOB.Value);
}
}
Puede construir un OracleLob que sea NULL con este formato:
OracleLob myLob = OracleLob.Null;
Esta técnica se usa principalmente para probar si un LOB devuelto desde el servidor es NULL, como se muestra en el ejemplo siguiente.
if (myLob == OracleLob.Null)
Un valor NULL LOB se comporta de forma similar a un byte LOB cero en que Read se ejecuta correctamente y siempre devuelve cero bytes.