合并查询返回-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;
我找到了一篇关于从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
我希望你能找到更好的答案。