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

Definição

Lê uma sequência de bytes do fluxo atual OracleLob e avança a posição dentro do fluxo pelo número de bytes lidos.

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

Uma matriz de bytes. Quando esse método retorna, o buffer contém a matriz de bytes especificada com os valores entre offset e (offset + count) substituídos pelos bytes lidos da origem atual.

offset
Int32

O deslocamento de bytes baseado em zero no buffer qual começar a armazenar os dados lidos do fluxo atual. Para CLOB e NCLOB tipos de dados, esse deve ser um número par.

count
Int32

O número máximo de bytes a serem lidos do fluxo atual. Para CLOB e NCLOB tipos de dados, esse deve ser um número par.

Retornos

O número total de bytes lidos no buffer. Isso pode ser menor do que o número de bytes solicitados se muitos bytes não estiverem disponíveis no momento ou zero (0) se o final do fluxo tiver sido atingido.

Exceções

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

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

- ou -

A soma dos parâmetros de deslocamento e contagem é maior que o comprimento do buffer.

- ou -

Um valor especificado no offset parâmetro é menor que zero ou maior que 4 gigabytes.

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

O objeto foi fechado ou descartado.

Ocorreu um erro do Oracle.

Comentários

O Read método lê um máximo de count bytes do fluxo atual e os armazena no buffer início em offset. A posição atual dentro do fluxo é avançada pelo número de bytes lidos; no entanto, se ocorrer uma exceção, a posição atual dentro do fluxo permanecerá inalterada. Read retorna o número de bytes lidos. O valor retornado será zero somente se a posição estiver atualmente no final do fluxo. Read bloqueará até que pelo menos um byte de dados possa ser lido, caso nenhum dado esteja disponível.Read retornará 0 se você tentar ler de um LOB quando a posição atual estiver no final de LOB. Read pode retornar menos bytes do que o solicitado mesmo se o final do fluxo não tiver sido atingido.

O .NET Framework Provedor de Dados para Oracle manipula todos os dados CLOB 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 NCLOB servidor Oracle em que o conjunto de caracteres é de 4 bytes por caractere e você executar uma Read operação, especifique o comprimento da cadeia de caracteres como 6 bytes, embora ela seja armazenada como 12 bytes no servidor.

O exemplo a seguir demonstra como ler 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);
    }
}

Você pode construir um OracleLob NULL usando este formato:

OracleLob myLob = OracleLob.Null;

Essa técnica é usada principalmente para testar se um LOB retornado do servidor é NULL, como ilustra o exemplo a seguir.

if (myLob == OracleLob.Null)

Um NULL LOB se comporta de forma semelhante a um byte LOB zero em que Read é bem-sucedido e sempre retorna zero bytes.

Aplica-se a