OracleLob 类 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示存储在 Oracle 服务器上的大型对象二进制 (LOB) 数据类型。 此类不能被继承。
public ref class OracleLob sealed : System::IO::Stream, ICloneable, System::Data::SqlTypes::INullablepublic sealed class OracleLob : System.IO.Stream, ICloneable, System.Data.SqlTypes.INullabletype OracleLob = class
    inherit Stream
    interface ICloneable
    interface IDisposable
    interface INullablePublic 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事务中更改数据,所做的更改将直接反映在数据库中。 如果将 Oracle- LOB值检索到 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。 |