我试图从Oracle数据库中读取BLOB.函数GetFileContent将p_file_id作为参数并返回BLOB.BLOB是一个DOCX文件,需要写在某个文件夹中.但我无法弄清楚如何阅读BLOB.肯定有一些东西存储在return_value-paramater之后
OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
Run Code Online (Sandbox Code Playgroud)
值为{byte [9946]}.但是我在执行时遇到错误
long retrievedBytes = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize);
Run Code Online (Sandbox Code Playgroud)
它说InvalidOperationException被捕获:"行或列没有数据."
这是代码:
cmd = new OracleCommand("GetFileContent", oraCon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("p_file_id", OracleType.Number).Direction = ParameterDirection.Input;
cmd.Parameters[0].Value = fileID;
cmd.Parameters.Add("return_value", OracleType.Blob).Direction = ParameterDirection.ReturnValue;
cmd.Connection.Open();
OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
reader.Read();
MemoryStream memory = new MemoryStream();
long startIndex = 0;
const int ChunkSize = 256;
while (true)
{
byte[] buffer = new byte[ChunkSize];
long retrievedBytes = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize); //FAILS
memory.Write(buffer, 0, (int)retrievedBytes);
startIndex += retrievedBytes;
if (retrievedBytes != ChunkSize)
break;
}
cmd.Connection.Close();
byte[] data = memory.ToArray();
memory.Dispose();
Run Code Online (Sandbox Code Playgroud)
如何从函数中读取BLOB?
您似乎正在使用 Microsoft Oracle 客户端。您可能想要使用 LOB 对象而不是使用 GetBytes(...)。
我认为下面的第一个链接对您来说是最简单的。以下是摘录:
using(reader)
{
//Obtain the first row of data.
reader.Read();
//Obtain the LOBs (all 3 varieties).
OracleLob BLOB = reader.GetOracleLob(1);
...
//Example - Reading binary data (in chunks).
byte[] buffer = new byte[100];
while((actual = BLOB.Read(buffer, 0, buffer.Length)) >0)
Console.WriteLine(BLOB.LobType + ".Read(" + buffer + ", " + buffer.Length + ") => " + actual);
...
}
Run Code Online (Sandbox Code Playgroud)
OracleDataReader::GetOracleLob 方法
附带说明一下,Microsoft Oracle 客户端正在降价。您可能需要考虑切换到 Oracle 的 ODP.net,因为这将是未来唯一的“官方支持”客户端。
| 归档时间: |
|
| 查看次数: |
13477 次 |
| 最近记录: |