OracleLob.Read(Byte[], Int32, Int32) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
从当前 OracleLob 流中读取字节序列,并在该流中按照读取的字节数提升位置。
public:
override int Read(cli::array <System::Byte> ^ buffer, int offset, int count);
public override int Read (byte[] buffer, int offset, int count);
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer
参数
- buffer
- Byte[]
字节数组。 当此方法返回时,此缓冲区包含指定的字符数组,此数组中 offset
和 (offset
+ count
) 之间的值被从当前源中读取的字节所替换。
- offset
- Int32
buffer
中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据。 对于 CLOB
和 NCLOB
数据类型,它必须为偶数。
- count
- Int32
要从当前流中最多读取的字节数。 对于 CLOB
和 NCLOB
数据类型,它必须为偶数。
返回
读入缓冲区中的总字节数。 如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。
例外
buffer
为空引用(在 Visual Basic 中为 Nothing
)。
offset
或 count
参数中的值为非正。
- 或 -
offset 参数与 count 参数之和大于 buffer 的长度。
- 或 -
amount
或 offset
参数中指定的值小于零,或大于 4 GB。
该操作未处在事务中,OracleLob 对象为 null,或者连接已关闭。
对象已关闭或已释放。
发生了 Oracle 错误。
注解
方法 Read 从当前流中读取最大字节数 count
,并将它们 buffer
存储在 从 offset
开始的 中。 流中的当前位置按读取的字节数提前;但是,如果发生异常,流中的当前位置保持不变。
Read 返回读取的字节数。 仅当位置当前位于流的末尾时,返回值为零。
Read将阻止,直到至少有一个字节的数据可以读取,如果没有任何数据可用。Read如果尝试在当前位置位于 的LOB
末尾时从 LOB
读取,则返回 0。
Read 即使尚未到达流的末尾,也可以返回的字节数少于请求的字节数。
适用于 Oracle 的 .NET Framework 数据提供程序将所有 CLOB
和 NCLOB
数据作为 Unicode 处理。 因此,在访问 CLOB
和 NCLOB
数据类型时,始终处理字节数,其中每个字符为 2 个字节。 例如,如果包含三个字符的文本字符串在 Oracle 服务器上保存为 , NCLOB
其中字符集为每个字符 4 个字节,并且您执行某个 Read
操作,则可以将字符串的长度指定为 6 个字节,尽管该字符串在服务器上存储为 12 个字节。
以下示例演示如何读取 OracleLob 对象。
public static void ReadLobExample(OracleCommand command)
{
int actual = 0;
// Select some data.
// Table Schema:
// "CREATE TABLE TableWithLobs (a int, b BLOB, c CLOB, d NCLOB)";
// "INSERT INTO TableWithLobs values (1, 'AA', 'AAA', N'AAAA')";
command.CommandText = "SELECT * FROM TableWithLobs";
OracleDataReader reader = command.ExecuteReader();
using(reader)
{
// Obtain the first row of data.
reader.Read();
// Obtain the LOBs (all 3 varieties).
OracleLob BLOB = reader.GetOracleLob(1);
OracleLob CLOB = reader.GetOracleLob(2);
OracleLob NCLOB = reader.GetOracleLob(3);
// Example - Reading binary data (in chunks).
var buffer = new byte[100];
while((actual = BLOB.Read(buffer, 0, buffer.Length)) > 0)
Console.WriteLine(BLOB.LobType + ".Read(" + buffer + ", " + buffer.Length + ") => " + actual);
// Example - Reading CLOB/NCLOB data (in chunks).
// Note: You can read character data as raw Unicode bytes (using OracleLob.Read as in the above example).
// However, because the OracleLob object inherits directly from the.NET stream object,
// all the existing classes that manipulate streams can also be used. For example, the
// .NET StreamReader makes converting the raw bytes into actual characters easier.
var streamreader = new StreamReader(CLOB, Encoding.Unicode);
var cbuffer = new char[100];
while((actual = streamreader.Read(cbuffer, 0, cbuffer.Length)) >0)
Console.WriteLine(CLOB.LobType + ".Read(" + new string(cbuffer, 0, actual) + ", " + cbuffer.Length + ") => " + actual);
//Example - Reading data (all at once).
//You could use StreamReader.ReadToEnd to obtain all the string data,or simply
//call OracleLob.Value to obtain a contiguous allocation of all the data.
Console.WriteLine(NCLOB.LobType + ".Value => " + NCLOB.Value);
}
}
可以使用以下格式构造 OracleLob NULL 的 :
OracleLob myLob = OracleLob.Null;
此方法主要用于测试从服务器返回的 是否 LOB
为 NULL,如以下示例所示。
if (myLob == OracleLob.Null)
NULL LOB
的行为类似于 中Read成功且始终返回零字节的零字节LOB
。