2015-08-21 55 views
0

我们有一个旧应用程序,它针对Oracle数据库运行,并使用DataSet,DataTables和TableAdapter。它使用现在已弃用的System.Data.OracleClient,我们正在考虑用DevArt替换这个dll。合并查询返回-1而不是合并的行数

我使用Oracle迁移向导从System.Data.OracleClient迁移到Devart.Data.Oracle。迁移后,所有查询都可以继续正常工作,除了一种类型:MERGE查询。他们仍然合并记录就好(预期的记录被插入/更新)。但是,之前已合并的记录数已返回,但现在它总是返回“-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; 
+0

这篇文章可以帮助你。 http://stackoverflow.com/questions/23601304/oracle-merge-statement-not-sticking-using-devart-dotconnect-for-oracle –

+0

@RameshBabu不同的问题:合并在我的情况下是“粘”(更新和插入确实发生)。我有一个返回值的问题。话虽如此,我尝试了所提到的解决方案,但将Direct = true添加到连接字符串只会导致应用程序无法连接。 – Sam

+0

添加一段代码,可以帮助您获得答案。 – Exhausted

回答

2

我发现了大约从Oracle客户端至devart迁移的制品。他基本上说“这是devart的作品”。你可以找到以下信息:

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

阅读全文,请点击here

+0

不幸的是,似乎'不行,替换UPDATE/INSERT'是我的情况中唯一可行的解​​决方案。 – Sam

+0

在基础设施层面改变一些东西总是很痛苦......希望你会找到一种更好的方式,但现在看来你需要坚持下去。 – umut

2

在ODP.NET ExecuteNonQuery甲骨文声明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更好的答案。