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

本文关键字:合并 查询 返回 | 更新日期: 2023-09-27 18:09:09

我们有一个运行在Oracle数据库上的旧应用程序,它使用了DataSets, datattables和TableAdapters。它使用现在已弃用的System.Data.OracleClient,我们希望用DevArt的dll替换此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;

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

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

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

阅读全文,点击这里

In 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

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