Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并查询返回-1,而不是合并的行数_C#_Oracle_Merge_Devart - Fatal编程技术网

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

C# 合并查询返回-1,而不是合并的行数,c#,oracle,merge,devart,C#,Oracle,Merge,Devart,我们有一个针对Oracle数据库运行的旧应用程序,它使用数据集、数据表和TableAdapter。它使用现已弃用的System.Data.OracleClient,我们希望用DevArt的dll替换此dll 我使用Oracle迁移向导从System.Data.OracleClient迁移到Devart.Data.Oracle。迁移之后,除了一种类型:合并查询之外,所有查询都可以正常工作。它们仍然可以很好地合并记录(插入/更新预期的记录)。但是,以前合并的记录数是返回的,但现在它总是返回“-1”

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

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

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

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

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;

我发现了一篇关于从oracle客户端迁移到devart的文章。他基本上说“这就是德瓦特的工作方式”。详情如下:

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


要阅读全文,请单击

我找到了一篇关于从oracle客户端迁移到devart的文章。他基本上说“这就是德瓦特的工作方式”。详情如下:

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


要阅读全文,请单击ODP.NET
ExecuteNonQuery
中的,for 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找到更好的答案。

在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

我希望你能为德瓦特找到更好的答案。

这篇文章可能会对你有所帮助@RameshBabu不同的问题:在我的情况下,合并不会“粘住”(更新和插入确实会发生)。我对返回值有问题。话虽如此,我尝试了上述解决方案,但在连接字符串中添加Direct=true只会使应用程序根本无法连接。添加一段代码,这可能会帮助您获得答案。@已用尽数据集生成的代码,但我添加了它。这篇文章可能会对您有所帮助@RameshBabu不同的问题:在我的情况下,合并不会“粘住”(更新和插入确实会发生)。我对返回值有问题。话虽如此,我尝试了上述解决方案,但在连接字符串中添加Direct=true只会使应用程序根本无法连接。添加一段代码,这可能会帮助您获得答案。@耗尽数据集生成的代码,但我添加了它。遗憾的是,似乎“不起作用,“替换为更新/插入”是我唯一可行的解决方案。在基础架构级别更改某些内容总是很痛苦的。。。希望您能找到更好的方法,但目前看来您需要坚持下去。遗憾的是,在我的情况下,“不起作用,用更新/插入替换”似乎是唯一可行的解决方案。在基础架构级别更改某些内容总是痛苦的。。。希望你能找到更好的方法,但现在看来你需要坚持下去。