我正在尝试使用带有输出参数(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变量内部的连接状态已关闭。
我无法理解为什么会这样。任何提示或帮助将不胜感激。
谢谢, 迪帕克
答案 0 :(得分:0)
大多数情况下(和我一起),这是一个愚蠢的错误。我更专注于BLOB变量,几乎忽略了其余的东西。
我在做
db.ExecuteNonQuery(cmd);
此后连接正在关闭。我将代码更改为
cmd.ExecuteNonQuery();
现在工作正常。
希望这会帮助别人并节省一些时间。
干杯, 迪帕克