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 中的从零开始的字节偏移量,从此处开始将字节复制到当前流。 对于 CLOBNCLOB 数据类型,它必须为偶数。

count
Int32

要写入当前流的字节数。 对于 CLOBNCLOB 数据类型,它必须为偶数。

例外

buffer 参数为 null 引用(在 Visual Basic 中为 Nothing)。

offsetcount 参数中的值为非正。

- 或 -

offset 参数与 count 参数之和大于 buffer 的长度。

- 或 -

countoffset 参数中指定的值小于零,或大于 4 GB。

- 或 -

必须将 CLOBNCLOB 数据类型指定为偶数字节数。

该操作未处在事务中,OracleLob 对象为 null,或者连接已关闭。

对象已关闭或已释放。

发生了 Oracle 错误。

注解

如果写入操作成功,则流中的位置将按写入的字节数前进。 如果发生异常,则流中的位置保持不变。

允许在 末尾 LOB 之外写入 ,并按写入的字节数放大 LOB

用于 Oracle 的 .NET Framework 数据提供程序以 Unicode 的形式处理所有数据CLOBNCLOB。 因此,在访问 CLOBNCLOB 数据类型时,始终处理字节数,其中每个字符为 2 个字节。 例如,如果包含三个字符的文本字符串在 Oracle 服务器上保存为 , NCLOB 该字符串的字符集为每个字符 4 个字节,并且您执行操作 Write 时,可以将字符串的长度指定为 6 个字节,尽管该字符串在服务器上存储为 12 个字节。

若要写入 到 , LOB必须在 SQL SELECT 语句中使用 FOR UPDATE 子句检索 LOB ,并且必须启动本地事务。

以下示例演示如何写入 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 对象的读取操作可能会返回写入操作的结果。

适用于