2014-01-29 32 views
5

我想插入两行到表(sequentiel)。第一个插入命令执行没有任何问题。第二个插入命令卡在ExecuteNonQuery()部件中。当我删除返回部分(OracleParameterDirection = Output)时,两个插入都是成功的。第二次插入失败,因为返回到输出参数(OracleParameter)

无效(序列中的每个不同的数据执行两次):

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重命名参数。

任何想法,为什么执行卡住了,我该如何解决这个问题?

编辑:

这里不再代码片段:

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

显示C#代码.... –

+0

我已经把代码片段编辑部分 – hy13

+0

我仍然想看看如何发布代码被调用两次 –

回答

0

尝试通过重命名有些输出变量定义为outputRowId ParameterDirection.InputOutput

+0

还没有解决问题。它仍然卡在'ExecuteNonQuery()'部分 – hy13

+0

我已经在oracle数据库10.2.0.4,.NET Framework 2.0和Oracle.DataAccess 2.11.7.20上成功测试了你的代码。 您获得的确切错误消息是什么? – bdn02

+0

我没有收到错误。这是有趣的事情。他跳入“ExecuteNonQuery”,然后永远不会跳出。如果我没有使用[OracleTransaction](http://docs.oracle.com/html/E10927_01/OracleTransactionClass.htm#sthref2008),Row被添加到表中,但它也不会跳出ExecuteNonQuery '。我也在使用更高版本的Oracle.ManagedDataAccess(它是4.112.3.50)和.NET 4.0。 – hy13

0

的固定点与声明的问题缓存:

请尝试以下操作之一:

你能告诉你是如何两次调用语句(语句缓存清除关闭连接时适用)?

注意:catch语句会让我的皮肤爬行 - 编程中最致命的一个罪就是吞咽这样的错误。也许你正在试图做个简短的事情,但如果是这样的话,可以用一个简单的前缀替换掉;

+0

我测试了你的建议,但同样的问题一再出现。我已经设置CacheSize = 0和CachePurge = true,并用OracleConnectionStringBuilder构建连接字符串(否则我无法设置它们)。但它不起作用。创建一个新的连接也没有解决它。第二个电话是完全一样的。没有区别。只有参数的内容不同。关于说明:让你冷静。它只在这段代码中看起来如此。在原始代码中处理异常。 – hy13