OracleLob.Read(Byte[], Int32, Int32) 方法

定义

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

count
Int32

要从当前流中最多读取的字节数。 对于 CLOBNCLOB 数据类型,它必须为偶数。

返回

读入缓冲区中的总字节数。 如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。

例外

buffer 为空引用(在 Visual Basic 中为 Nothing)。

offsetcount 参数中的值为非正。

- 或 -

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

- 或 -

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

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

对象已关闭或已释放。

发生了 Oracle 错误。

注解

方法 Read 从当前流中读取最大字节数 count ,并将它们 buffer 存储在 从 offset开始的 中。 流中的当前位置按读取的字节数提前;但是,如果发生异常,流中的当前位置保持不变。 Read 返回读取的字节数。 仅当位置当前位于流的末尾时,返回值为零。 Read将阻止,直到至少有一个字节的数据可以读取,如果没有任何数据可用。Read如果尝试在当前位置位于 的LOB末尾时从 LOB 读取,则返回 0。 Read 即使尚未到达流的末尾,也可以返回的字节数少于请求的字节数。

适用于 Oracle 的 .NET Framework 数据提供程序将所有 CLOBNCLOB 数据作为 Unicode 处理。 因此,在访问 CLOBNCLOB 数据类型时,始终处理字节数,其中每个字符为 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

适用于