Compartir vía


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

Definición

Lee una secuencia de bytes en la secuencia OracleLob actual y hace avanzar la posición dentro de la secuencia en función del 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 un valor, el búfer contiene la matriz de bytes especificada con valores entre offset y (offset + count) reemplazada por los bytes leídos desde el origen actual.

offset
Int32

Posición de desplazamiento en bytes de base cero de buffer donde se comienza a almacenar los datos leídos de la secuencia actual. Para los tipos de datos CLOB y NCLOB, debe ser un número par.

count
Int32

Número máximo de bytes que se deben leer de la secuencia actual. Para los tipos de datos CLOB 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 solicitado si dicho número de bytes no está disponible en la actualidad, o cero (0) si se alcanza el final de la secuencia.

Excepciones

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 del búfer.

o bien

Un valor especificado en el parámetro amount u offset es menor que cero o mayor que 4 gigabytes.

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

El Read método lee un máximo de count bytes de la secuencia actual y los almacena a buffer partir offsetde . 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 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 un LOB cuando 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 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 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 realiza correctamente y siempre devuelve cero bytes.

Se aplica a