OracleLob.Write(Byte[], Int32, Int32) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
将一个字节序列写入当前 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
参数为 null 引用(在 Visual Basic 中为 Nothing
)。
offset
或 count
参数中的值为非正。
- 或 -
offset
参数与 count
参数之和大于 buffer
的长度。
- 或 -
count
或 offset
参数中指定的值小于零,或大于 4 GB。
- 或 -
必须将 CLOB
和 NCLOB
数据类型指定为偶数字节数。
该操作未处在事务中,OracleLob 对象为 null,或者连接已关闭。
对象已关闭或已释放。
发生了 Oracle 错误。
注解
如果写入操作成功,则流中的位置将按写入的字节数前进。 如果发生异常,则流中的位置保持不变。
允许在 末尾 LOB
之外写入 ,并按写入的字节数放大 LOB
。
用于 Oracle 的 .NET Framework 数据提供程序以 Unicode 的形式处理所有数据CLOB
NCLOB
。 因此,在访问 CLOB
和 NCLOB
数据类型时,始终处理字节数,其中每个字符为 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 对象的读取操作可能会返回写入操作的结果。