【问题标题】:Merge query returns -1 instead of number of rows merged合并查询返回 -1 而不是合并的行数
【发布时间】:2015-11-15 07:28:27
【问题描述】:

我们有一个针对 Oracle 数据库运行并使用 DataSet、DataTable 和 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;

【问题讨论】:

  • 这篇关于 SO 的帖子可能会对您有所帮助。 stackoverflow.com/questions/23601304/…
  • @RameshBabu 不同的问题:在我的情况下合并确实“坚持”(更新和插入确实发生)。我的返回值有问题。话虽如此,我尝试了上述解决方案,但在连接字符串中添加 Direct=true 只会使应用程序无法连接。
  • 添加一段代码,或许可以帮助你得到答案。
  • @Exhausted 其代码由数据集生成,但我加了。

标签: c# oracle merge devart


【解决方案1】:

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

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

阅读全文,请点击here

【讨论】:

  • 可悲的是,在我的情况下,似乎“不起作用,用 UPDATE/INSERT 替换”是唯一可行的解​​决方案。
  • 在基础架构级别进行更改总是很痛苦...希望您能找到更好的方法,但现在看来您需要坚持下去。
【解决方案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 的更好答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多