OracleLob.Write(Byte[], Int32, Int32) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Записывает последовательность байтов в текущий поток OracleLob и перемещает текущую позицию внутри потока на число записанных байтов.
public:
override void Write(cli::array <System::Byte> ^ buffer, int offset, int count);
public override void Write (byte[] buffer, int offset, int count);
override this.Write : byte[] * int * int -> unit
Public Overrides Sub Write (buffer As Byte(), offset As Integer, count As Integer)
Параметры
- buffer
- Byte[]
Массив байтов. Данный метод копирует количество байтов, заданных count
, из buffer
в текущий поток.
- offset
- Int32
Отсчитываемое от нуля смещение байтов в буфере buffer
, с которого начинается копирование байтов в текущий поток. Для типов данных CLOB
и NCLOB
это число должно быть четным.
- count
- Int32
Количество байтов, которое необходимо записать в текущий поток. Для типов данных CLOB
и NCLOB
это число должно быть четным.
Исключения
Значением параметра buffer
является пустая ссылка (Nothing
в Visual Basic).
Значение параметров offset
или count
не является положительным.
-или-
Сумма параметров offset
и count
превышает длину buffer
.
-или-
Значение, заданное для параметра count
или offset
, меньше нуля или больше 4 гигабайт.
-или-
Необходимо указать типы данных CLOB
и NCLOB
с четным количеством байтов.
Операция выполняется не в рамках транзакции, объект OracleLob является пустым, или же закрыто подключение.
Объект был закрыт или уничтожен.
Произошла ошибка Oracle.
Комментарии
Если операция записи выполнена успешно, позиция в потоке увеличивается на количество записанных байтов. При возникновении исключения позиция в потоке остается неизменной.
Запись после конца разрешена LOB
и увеличивает на LOB
количество записанных байтов.
Поставщик данных платформа .NET Framework для Oracle обрабатывает все CLOB
данные и NCLOB
как Юникод. Таким образом, при доступе к типам CLOB
данных и NCLOB
вы всегда имеете дело с числом байтов, где каждый символ равен 2 байтам. Например, если строка текста, содержащая три символа, сохраняется в виде на сервере NCLOB
Oracle, где набор символов составляет 4 байта на символ, и выполняется Write
операция, длина строки указывается как 6 байт, хотя она хранится на сервере как 12 байт.
Для записи в LOB
необходимо получить LOB
с помощью предложения FOR UPDATE в инструкции SQL SELECT и запустить локальную транзакцию.
В следующем примере показано, как выполнять запись в OracleLob объекты :
public static void WriteLobExample(OracleCommand command)
{
// Note: Updating LOB data requires a transaction.
command.Transaction = command.Connection.BeginTransaction();
// Select some data.
// Table Schema:
// "CREATE TABLE tablewithlobs (a int, b BLOB, c BLOB)";
// "INSERT INTO tablewithlobs values (1, 'AA', 'AAA')";
command.CommandText = "SELECT * FROM TableWithLobs FOR UPDATE";
OracleDataReader reader = command.ExecuteReader();
using(reader)
{
// Obtain the first row of data.
reader.Read();
// Obtain both LOBs.
OracleLob BLOB1 = reader.GetOracleLob(1);
OracleLob BLOB2 = reader.GetOracleLob(2);
// Perform any desired operations on the LOB, (read, position, and so on).
// ...
// Example - Writing binary data (directly to the backend).
// To write, you can use any of the stream classes, or write raw binary data using
// the OracleLob write method. Writing character vs. binary is the same;
// however note that character is always in terms of Unicode byte counts
// (for example: even number of bytes - 2 bytes for every Unicode character).
var buffer = new byte[100];
buffer[0] = 0xCC;
buffer[1] = 0xDD;
BLOB1.Write(buffer, 0, 2);
BLOB1.Position = 0;
Console.WriteLine(BLOB1.LobType + ".Write(" + buffer + ", 0, 2) => " + BLOB1.Value);
// Example - Copying data into another LOB.
long actual = BLOB1.CopyTo(BLOB2);
Console.WriteLine(BLOB1.LobType + ".CopyTo(" + BLOB2.Value + ") => " + actual);
// Commit the transaction now that everything succeeded.
// Note: On error, Transaction.Dispose is called (from the using statement)
// and will automatically roll-back the pending transaction.
command.Transaction.Commit();
}
}
Примечание
Операция записи в доступный только LOB
для чтения объект может завершиться успешно, но не обновляет LOB
на сервере. Однако в этом случае обновляется локальная копия LOB
. Поэтому последующие операции чтения для OracleLob объекта могут возвращать результаты операции записи.