C# 合并查询返回-1,而不是合并的行数
我们有一个针对Oracle数据库运行的旧应用程序,它使用数据集、数据表和TableAdapter。它使用现已弃用的System.Data.OracleClient,我们希望用DevArt的dll替换此dll 我使用Oracle迁移向导从System.Data.OracleClient迁移到Devart.Data.Oracle。迁移之后,除了一种类型:合并查询之外,所有查询都可以正常工作。它们仍然可以很好地合并记录(插入/更新预期的记录)。但是,以前合并的记录数是返回的,但现在它总是返回“-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”
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只会使应用程序根本无法连接。添加一段代码,这可能会帮助您获得答案。@耗尽数据集生成的代码,但我添加了它。遗憾的是,似乎“不起作用,“替换为更新/插入”是我唯一可行的解决方案。在基础架构级别更改某些内容总是很痛苦的。。。希望您能找到更好的方法,但目前看来您需要坚持下去。遗憾的是,在我的情况下,“不起作用,用更新/插入替换”似乎是唯一可行的解决方案。在基础架构级别更改某些内容总是痛苦的。。。希望你能找到更好的方法,但现在看来你需要坚持下去。