合并查询返回-1而不是合并的行数

时间:2015-08-21 11:12:04

标签: c# oracle merge devart

我们有一个针对Oracle数据库运行的旧应用程序,并使用DataSet,DataTables和TableAdapter。它使用现已弃用的System.Data.OracleClient,我们希望用DevArt替换这个dll。

我使用Oracle迁移向导从System.Data.OracleClient迁移到Devart.Data.Oracle。迁移后,除了一种类型:MERGE查询外,所有查询都可以继续正常工作。他们仍然很好地合并记录(插入/更新预期的记录)。但是,先前返回了合并的记录数,但现在它总是返回“-1”。

知道问题是什么吗?最好不必手动更新所有合并查询(有很多合并查询),但如果更新所有查询是唯一可以接受的解决方法。

处理数据库连接的代码由DataSet文件生成:

Devart.Data.Oracle.OracleCommand command = "MERGE INTO [...]";
System.Data.ConnectionState previousConnectionState = command.Connection.State;
if ((command.Connection.State & System.Data.ConnectionState.Open) != System.Data.ConnectionState.Open)
{
    command.Connection.Open();
    int returnValue;
    try
    {
        returnValue = command.ExecuteNonQuery();
    }
    finally
    {
        if (previousConnectionState != System.Data.ConnectionState.Closed)
        {
            command.Connection.Close();
        }
    }
}
return returnValue;

2 个答案:

答案 0 :(得分:2)

我发现了一篇关于从oracle客户端迁移到devart的文章。他基本上说"这就是devart的工作原理"。您可以在下面找到详细信息:

  

Devart只能为INSERT,UPDATE返回受影响的行数   和DELETE DML命令,在所有其他情况下它返回-1。我们用了   这些返回值有时在我们的api中表示是否   手术是否成功。使用这3个DML命令就可以了。   我们也有oracle的MERGE命令的几个用法,OracleClient可以   返回正确数量的受影响的行,devart返回-1。我们   改变了我们的API,其中MERGE用于不计入返回值。

要阅读完整文章,请点击here

答案 1 :(得分:2)

在ODP.NET ExecuteNonQuery中,Oracle语句merge也返回-1。 我知道的唯一解决方法是在PLSQL块中调用它并使用SQL%ROWCOUNT,如下所示:

  string sql =
      "begin " +
      "  merge into test t1 " +
      "    using (select col1, col2 from test) t2 on (t2.col1=t1.col1) " +
      "    when matched then update set col2=col2+1; " +
      "  :num := sql%rowcount; "+
      "end;";
  OracleCommand cmd = new OracleCommand(sql, myConnection);
  var p = cmd.Parameters.Add(":num", OracleDbType.Int32, ParameterDirection.Output);
  cmd.ExecuteNonQuery();
  Console.WriteLine("Rows affected: " + p.Value);

--------------------------
Sample output for my data: 
Rows affected: 2

我希望你能为Devart找到更好的答案。