OracleLob 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示存储在 Oracle 服务器上的大型对象二进制 (LOB
) 数据类型。 此类不能被继承。
public ref class OracleLob sealed : System::IO::Stream, ICloneable, System::Data::SqlTypes::INullable
public sealed class OracleLob : System.IO.Stream, ICloneable, System.Data.SqlTypes.INullable
type OracleLob = class
inherit Stream
interface ICloneable
interface IDisposable
interface INullable
Public NotInheritable Class OracleLob
Inherits Stream
Implements ICloneable, INullable
- 继承
- 实现
注解
OracleLob与 的不同之处在于OracleBFile,数据存储在服务器上,而不是存储在操作系统中的物理文件中。 它也可以是读写对象,这与 始终为只读的 不同 OracleBFile。
OracleLob可以是其中OracleType一种数据类型。
OracleType 数据类型 | 说明 |
---|---|
Blob |
包含最大大小为 4 GB (GB) 的二进制数据的 Oracle BLOB 数据类型。 它映射到 Array 类型的 Byte。 |
Clob |
一种 Oracle CLOB 数据类型,包含基于服务器上默认字符集的字符数据,最大大小为 4 GB。 它映射到 String。 |
NClob |
包含字符数据的 Oracle NCLOB 数据类型,基于服务器上最大大小为 4 GB 的国家/地区字符集。 它映射到 String。 |
.NET 应用程序开发人员可以将 Oracle LOB
值检索为基本 .NET 数据类型,例如 Array 和 String或Byte专用OracleLob数据类型。 类 OracleLob 支持在 Oracle LOB
数据库中读取和写入 Oracle 数据。
以下是数据类型与基本 .NET 数据类型的区别mainOracleLob特征:
将 Oracle 数据库中的 Oracle
LOB
值检索到 OracleLob 类后,可以在打开的LOB
事务中更改数据,所做的更改将直接反映在数据库中。 如果将 OracleLOB
值检索到 Array 或 String 类型的 Byte 中并更新这些数组,则所做的更改不会反映在数据库中。使用 OracleLob 类访问某个值的区块
LOB
时,只有该区块从 Oracle 数据库传递到客户端。 使用 GetChars 方法访问值的区块LOB
时,该值的整个内容将从 Oracle 数据库传递到客户端。
若要获取 OracleLob 对象,请 GetOracleLob 调用 方法。
可以使用以下格式构造 OracleLob NULL 的 :
OracleLob myLob = OracleLob.Null;
Dim myLob As OracleLob = OracleLob.Null
此方法主要用于测试从服务器返回的 是否 LOB
为 NULL,如以下示例所示:
if (myLob == OracleLob.Null)
If (myLob = OracleLob.Null) Then
NULL LOB
的行为类似于 中Read成功且始终返回零字节的零字节LOB
。
LOB
选择包含 null 值的列将Null返回 。
在获取临时 LOB
之前,必须开始事务。 否则, OracleDataReader 以后可能无法获取数据。
还可以通过调用 DBMS_LOB在 Oracle 中打开临时 LOB
。CREATETEMPORARY 系统存储过程并绑定 LOB
输出参数。 在客户端,临时 LOB
的行为类似于基于 LOB
表的 。 例如,若要更新临时 LOB
,必须将其包含在事务中。
以下示例演示如何打开临时 LOB
:
var connection = new OracleConnection("server=MyServer; integrated security=yes;");
connection.Open();
OracleTransaction transaction = connection.BeginTransaction();
OracleCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";
command.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob)).Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
var tempLob = (OracleLob)command.Parameters[0].Value;
var tempbuff = new byte[10000];
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(tempbuff,0,tempbuff.Length);
tempLob.EndBatch();
command.Parameters.Clear();
command.CommandText = "MyTable.MyProc";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new OracleParameter("ImportDoc", OracleType.Blob)).Value = tempLob;
command.ExecuteNonQuery();
transaction.Commit();
connection.Close();
注意
如果与字符数据一起使用,则继承 WriteByte 的方法将失败,并 InvalidOperationException 引发 。 请改用 Write 方法。
临时 LOB
仅在连接关闭时关闭,但在池和负载不足的情况下,临时 LOB
不会关闭。 这可以通过释放临时 LOB
,通过调用 tempLob.Dispose()
来解决。
字段
Null |
表示一个 null OracleLob 对象。 |
属性
CanRead |
获取一个值,该值指示 |
CanSeek |
获取一个值,该值指示能否执行向前和向后查找操作。 |
CanTimeout |
获取一个值,该值确定当前流是否可以超时。 (继承自 Stream) |
CanWrite |
不管 |
ChunkSize |
获取一个值,该值指示读/写操作过程中要从服务器检索或发送到服务器的最小字节数。 |
Connection |
获取由该 OracleConnection 实例使用的 OracleLob。 |
IsBatched |
获取一个值,该值指示应用程序是否调用了 BeginBatch() 方法。 |
IsNull | |
IsTemporary |
获取一个值,该值指示 OracleLob 是否为临时 |
Length |
获取一个值,该值返回 OracleLob 的大小。 |
LobType |
获取一个值,该值返回 |
Position |
获取 OracleLob 流中的当前读取位置。 |
ReadTimeout |
获取或设置一个值(以毫秒为单位),该值确定流在超时前将尝试读取的时间。 (继承自 Stream) |
Value |
获取公共语言运行时流值(基础值的等效值)。 |
WriteTimeout |
获取或设置一个值(以毫秒为单位),该值确定流在超时前将尝试写入多长时间。 (继承自 Stream) |
方法
显式接口实现
IDisposable.Dispose() |
释放由 Stream 使用的所有资源。 (继承自 Stream) |
扩展方法
CopyToAsync(Stream, PipeWriter, CancellationToken) |
使用取消令牌从 Stream 中异步读取字节并将其写入到指定的 PipeWriter。 |