试着读一个blob

时间:2011-02-07 12:44:43

标签: c# oracle blob

我正在尝试从Oracle数据库中读取BLOB。函数GetFileContent将p_file_id作为参数并返回BLOB。 BLOB是一个DOCX文件,需要写在某个文件夹中。但我无法弄清楚如何阅读BLOB。

之后肯定存在于return_value-paramater中的东西
OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);

值为{byte [9946]}。但是我在执行

时遇到错误
long retrievedBytes = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize);

它表示发生了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();

如何从函数中读取BLOB?

1 个答案:

答案 0 :(得分:2)

看起来您正在使用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);

      ...
}

<强> OracleLob::Read Method

OracleLob Class

OracleDataReader::GetOracleLob Method

另外,Microsoft Oracle客户端正在折旧。您可能需要考虑切换到Oracle的ODP.net,因为这将是唯一“正式支持”的客户端。