由于返回输出参数(OracleParameter),第二次插入失败

时间:2014-01-29 11:56:21

标签: c# .net database oracle odp.net

我试图在表格中插入两行(sequentiel)。执行第一个插入命令没有任何问题。第二个插入命令卡在ExecuteNonQuery()部分中。当我删除返回的部分(OracleParameterDirection = 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 })

参考:OracleParameter

有趣的是,当我使用第一个方法(返回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;
                    }
                }
            }

2 个答案:

答案 0 :(得分:0)

尝试将outputRowId定义为ParameterDirection.InputOutput

答案 1 :(得分:0)

通过重命名输出变量的修复在某种程度上指出了语句缓存的问题:

请尝试以下方法之一:

你能说明你如何两次打电话吗?

注意:catch语句使我的皮肤爬行 - 我编程中最致命的罪恶之一是吞噬这样的错误。也许你正试图做一个简短的但是如果这样交换那个回报用一个抛出ex;