我们有一个针对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;
答案 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找到更好的答案。