OracleLob.Read(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.
Lê uma sequência de bytes do fluxo OracleLob atual de forma assíncrona e avança a posição no fluxo até o 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 em buffer
no qual será iniciada a leitura de dados no fluxo atual. Para os tipos de dados CLOB
e NCLOB
, isso deve ser um número par.
- count
- Int32
O número máximo de bytes a serem lidos no fluxo atual. Para os tipos de dados CLOB
e NCLOB
, isso deve ser um número par.
Retornos
O número total de bytes lidos do buffer. Isso poderá ser menor que o número de bytes solicitado se esses muitos bytes não estiverem disponíveis no momento ou zero (0) se o final do fluxo tiver sido atingido.
Exceções
O 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 de deslocamento e contagem é maior do que o tamanho do buffer.
- ou -
Um valor especificado no parâmetro amount
ou offset
é menor que zero ou maior que 4 gigabytes.
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
O Read método lê um máximo de count
bytes do fluxo atual e os armazena no começando em buffer
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 que o final do fluxo não tenha sido atingido.
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 que contém três caracteres for salva como um NCLOB
em um 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 que seja 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 no que Read é bem-sucedido e sempre retorna zero bytes.