错误"此操作必须打开连接"从oracle数据库读取BLOB时

时间:2014-06-10 08:47:37

标签: c# oracle blob

我正在尝试使用带有输出参数(parm)的存储过程从oracle数据库中检索BLOB值。这是我执行此操作的代码段。

using (DbCommand cmd = db.GetStoredProcCommand(sStoredProcName))
{
  cmd.Connection = conn;
  AttachParameters(db, cmd, lParamValueList);

  // Open connection
  if (idbTransaction != null)
  {
    db.ExecuteNonQuery(cmd, idbTransaction);
  }
  else
  {
    db.ExecuteNonQuery(cmd);
  }
  // Retrieve any return values
  GetReturnValues(db, conn, cmd, ref lParamValueList);
}

然后在GetReturnValues下有另一个调用函数,这段麻烦的代码是

cmd.Connection = conn;
if (db != null && cmd != null && (Out || IsReturnValue))
{
  int iIndex = ((Oracle.DataAccess.Client.OracleCommand)cmd).Parameters.IndexOf(ParamName);
  if (iIndex >= 0)
  {
    Oracle.DataAccess.Client.OracleParameter parm = (((Oracle.DataAccess.Client.OracleCommand)cmd).Parameters[iIndex]);

   if (conn.State == ConnectionState.Closed)
     conn.Open();

     Oracle.DataAccess.Types.OracleBlob blob = new Oracle.DataAccess.Types.OracleBlob((Oracle.DataAccess.Client.OracleConnection)conn);
     blob = (Oracle.DataAccess.Types.OracleBlob)parm.Value;  //<============== Troubled code

     if (blob.Length > 0)
     {
       byte[] bytes = new byte[blob.Length];
       blob.Read(bytes, 0, (int)blob.Length);
       ReturnValueBytes = bytes;
      }
...

除非它到达我将输出参数值设置为ORACLEBLOB变量的代码行,否则一切似乎都能正常工作。我知道ORACLE BLOB要求显式打开连接。直到困难的行,BLOB连接状态打开并且一旦通过

blob = (Oracle.DataAccess.Types.OracleBlob)parm.Value

BLOB变量内部的连接状态已关闭。

我无法理解为什么会这样。任何提示或帮助将不胜感激。

谢谢, 迪帕克

1 个答案:

答案 0 :(得分:0)

大多数情况下(和我一起),这是一个愚蠢的错误。我更专注于BLOB变量,几乎忽略了其余的东西。

我在做

db.ExecuteNonQuery(cmd);

此后连接正在关闭。我将代码更改为

cmd.ExecuteNonQuery();

现在工作正常。

希望这会帮助别人并节省一些时间。

干杯, 迪帕克