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 выполняется успешно и всегда возвращает ноль байтов.