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


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 объекта могут возвращать результаты операции записи.

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