Поделиться через


OracleLob.Read(Byte[], Int32, Int32) Метод

Определение

Считывает последовательность байтов из текущего потока OracleLob и перемещает позицию внутри потока на число считанных байтов.

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

Параметры

buffer
Byte[]

Массив байтов. При возвращении данного метода буфер содержит указанный массив байтов, в котором значения между offset и (offset + count) заменены байтами, считанными из текущего источника.

offset
Int32

Смещение байтов (начиная с нуля) в buffer, с которого начинается сохранение данных, считанных из текущего потока. Для типов данных CLOB и NCLOB это число должно быть четным.

count
Int32

Максимальное количество байтов, которое должно быть считано из текущего потока. Для типов данных CLOB и NCLOB это число должно быть четным.

Возвращаемое значение

Общее количество байтов, считанных в буфер. Это число может быть меньше количества запрошенных байтов, если столько байтов в настоящее время недоступно, а также равняться нулю (0), если был достигнут конец потока.

Исключения

buffer является пустой ссылкой (Nothing в Visual Basic).

Значение параметров offset или count не является положительным.

-или-

Сумма параметров смещения и счетчика превышает длину буфера.

-или-

Значение, заданное для параметра amount или offset, меньше нуля или больше 4 гигабайт.

Операция выполняется не в рамках транзакции, объект OracleLob является пустым, или же закрыто подключение.

Объект был закрыт или уничтожен.

Произошла ошибка Oracle.

Комментарии

Метод Read считывает максимум байтов из текущего count потока и сохраняет их в buffer , начиная с offset. Текущая позиция в потоке удобочитается на количество прочитанных байтов; Однако при возникновении исключения текущая позиция в потоке остается неизменной. Read возвращает число прочитанных байтов. Возвращаемое значение равно нулю, только если позиция в данный момент находится в конце потока. Read будет блокироваться до тех пор, пока не удастся прочитать хотя бы один байт данных, если данные не будут доступны.Read возвращает значение 0 при попытке чтения из , LOB когда текущая позиция находится в конце LOB. Read может возвращать меньше байтов, чем запрошено, даже если конец потока не достигнут.

Поставщик данных платформа .NET Framework для Oracle обрабатывает все CLOB данные и NCLOB как Юникод. Таким образом, при доступе к типам CLOB данных и NCLOB вы всегда имеете дело с числом байтов, где каждый символ равен 2 байтам. Например, если строка текста, содержащая три символа, сохраняется в виде на сервере NCLOB Oracle, где набор символов составляет 4 байта на символ, и выполняется Read операция, длина строки указывается как 6 байт, хотя она хранится на сервере как 12 байт.

В следующем примере показано, как считывать OracleLob объекты .

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);  
    }  
}  

Можно создать объект со значением OracleLob NULL, используя следующий формат:

OracleLob myLob = OracleLob.Null;  

Этот метод используется в основном для проверки того, имеет ли возвращенный сервером LOB значение NULL, как показано в следующем примере.

if (myLob == OracleLob.Null)  

Значение NULL LOB ведет себя аналогично нулевому байту LOB в , который Read выполняется успешно и всегда возвращает ноль байтов.

Применяется к