我试图在表格中插入两行(sequentiel)。执行第一个插入命令没有任何问题。第二个插入命令卡在ExecuteNonQuery()
部分中。当我删除返回的部分(OracleParameter
和Direction = Output
)时,两个插入都成功。
不起作用(在每个具有不同数据的序列中执行两次):
cmd.CommandText = "INSERT INTO table (Col1, Col2, Col3,...) VALUES (:ParamCol1, :ParamCol2, :ParamCol3,...) RETURNING ROWIDTOCHAR(ROWID) INTO :OutputROWID";
使用:
cmd.CommandText = "INSERT INTO table (Col1, Col2, Col3,...) VALUES (:ParamCol1, :ParamCol2, :ParamCol3,...)";
输出参数的声明和初始化如下:
OracleParameter outputRowId = new OracleParameter(":OutputROWID", OracleDbType.Varchar2, 30) { Direction = ParameterDirection.Output })
有趣的是,当我使用第一个方法(返回ROWID
)时,它也有效,但只有当我将第二个插入中的参数重命名为:OutputROWID2
时才会有效。
关于为什么执行陷入困境以及如何解决这个问题的任何想法?
编辑:
这里有更长的Code-Snippet:
using (OracleTransaction transaction = Globals.Db.Connection.BeginTransaction())
{
using (OracleCommand cmd = Globals.Db.Connection.CreateCommand())
{
cmd.BindByName = true;
cmd.CommandText = "INSERT INTO table (Col1, Col2, Col3,...) VALUES (:ParamCol1, :ParamCol2, :ParamCol3,...) RETURNING ROWIDTOCHAR(ROWID) INTO :OutputROWID";
OracleParameter outputRowId = new OracleParameter(":OutputROWID", OracleDbType.Varchar2, 30) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(paramCol1, data["Col1"]);
cmd.Parameters.Add(paramCol2, data["Col2"]);
cmd.Parameters.Add(paramCol3, data["Col3"]);
...
cmd.Parameters.Add(outputRowId);
try
{
cmd.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception ex)
{
return;
}
}
}
答案 0 :(得分:0)
尝试将outputRowId定义为ParameterDirection.InputOutput
答案 1 :(得分:0)
通过重命名输出变量的修复在某种程度上指出了语句缓存的问题:
请尝试以下方法之一:
你能说明你如何两次打电话吗?
注意:catch语句使我的皮肤爬行 - 我编程中最致命的罪恶之一是吞噬这样的错误。也许你正试图做一个简短的但是如果这样交换那个回报用一个抛出ex;