C# 第二次插入失败,因为返回到输出参数(OracleParameter)

C# 第二次插入失败,因为返回到输出参数(OracleParameter),c#,.net,database,oracle,odp.net,C#,.net,Database,Oracle,Odp.net,我试图在一个表中插入两行(sequentiel)。第一个insert命令可以顺利执行。第二个insert命令卡在ExecuteNonQuery()部分。当我用Direction=Output移除返回部件(OracleParameter)时,两次插入都成功 不起作用(以不同数据顺序执行两次): cmd.CommandText=“插入表(Col1,Col2,Col3,…)值(:ParamCol1,:ParamCol2,:ParamCol3,…),将ROWIDTOCHAR(ROWID)返回到:Outp

我试图在一个表中插入两行(sequentiel)。第一个insert命令可以顺利执行。第二个insert命令卡在
ExecuteNonQuery()
部分。当我用
Direction=Output
移除返回部件(
OracleParameter
)时,两次插入都成功

不起作用(以不同数据顺序执行两次):

cmd.CommandText=“插入表(Col1,Col2,Col3,…)值(:ParamCol1,:ParamCol2,:ParamCol3,…),将ROWIDTOCHAR(ROWID)返回到:OutputROWID”

作品:

cmd.CommandText=“插入表(Col1,Col2,Col3,…)值(:ParamCol1,:ParamCol2,:ParamCol3,…)

输出参数的声明和初始化如下所示:

OracleParameter outputRowId=新的OracleParameter(“:outputRowId”,OracleDbType.Varchar2,30){Direction=ParameterDirection.Output})

参考:

有趣的是,当我使用第一个方法(返回
ROWID
)时,它也可以工作,但只有当我将第二个插入中的参数重命名为,即
:OutputROWID2

有没有关于为什么执行会受阻以及我如何解决这个问题的想法

编辑:

下面是较长的代码片段:

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;
                    }
                }
            }

尝试将outputRowId定义为ParameterDirection。InputOutput

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

请尝试以下操作之一:

  • 在连接字符串集中:语句缓存大小=0(不完全确定0表示不缓存)
  • 在连接字符串集中:语句缓存清除=true
  • …并为第二个操作创建新连接(关闭连接时应用语句缓存清除)
你能展示一下你是如何两次调用这个语句的吗


注意:catch语句让我毛骨悚然——编程中最致命的罪过就是吞下这样的错误。也许你是想简明扼要,但如果是这样的话,你可以用一个前投手来交换那个回球

我已经将代码片段放入编辑部分,我仍然希望看到发布的代码如何被调用,但还没有解决这个问题。它仍然卡在
ExecuteNonQuery()
partI中。我已在oracle数据库10.2.0.4、.NET Framework 2.0和oracle.DataAccess 2.11.7.20上成功测试了您的代码。你得到的确切错误信息是什么?我没有得到错误。真有趣。他跳入
ExecuteNonQuery
,然后它再也不会跳出。如果不使用该行,该行将添加到表中,但它也不会跳出
ExecuteNonQuery
。我还使用了更高版本的Oracle.ManagedDataAccess(它是4.112.3.50)和.NET 4.0。我不知道,我发现存在System.Data.ParameterDirection.ReturnValue,我在我的应用程序上进行了测试,没有错误。让你试试?(对不起mi英语)我现在用ReturnValue测试了它,但结果是一样的。我已经测试了你的建议,但同样的问题一再出现。我已经设置了CacheSize=0和CachePurge=true,并使用OracleConnectionStringBuilder构建了connectionstring(否则我无法同时设置两者)。但它不起作用。创建新连接也没有解决这个问题。第二次呼叫完全相同。没有区别。只是参数的内容不同。关于便条:让你平静下来。在这个代码片段中看起来是这样的。在原始代码中处理异常。