无法在merge语句中捕获错误

时间:2015-11-12 04:43:31

标签: vb.net oracle error-handling oledb oledbcommand

嗨我在合并声明中遇到错误有问题 在SQL Plus中运行时,merge语句将出现以下错误:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER

当我在Vb.net中使用ExecuteNonQuery执行语句时不会出现任何异常 有没有办法在Vb.net中捕获该错误而不在合并语句中使用日志错误?

编辑:

Try
    Dim count as Interger=0
    Dim cmd As New OleDb.OleDbCommand(strSQL)
    count = cmd .ExecuteNonQuery()
Catch ex as Exception
    ... Respond ...
End Try

示例合并声明错误:

MERGE INTO TABLE_A a USING
(
    SELECT ID,SUM(AMOUNT) AMOUNT
    FROM TABLE_B b
    GROUP BY ID
) b
ON ( b.ID=a.ID )
WHEN MATCHED THEN 
    UPDATE SET a.AMOUNT=a.AMOUNT+b.AMOUNT 
WHEN NOT MATCHED THEN 
    INSERT (ID, DT, AMOUNT) VALUES (b.ID, 0, b.AMOUNT);

SQL Plus将在插入时出错,但Vb.net无法捕获 字段DT的数据类型是DATE。

1 个答案:

答案 0 :(得分:1)

编辑3: 我的坏 - 在这种情况下,我认为您必须订阅oleDbConnection.InfoMessage事件并在MERGE命令后检查适用的SQL-00932消息。我没有在OLE-DB中看到FireInfoMessageEventOnUserErrors的任何等效属性(再次看起来完全倒退了......)。

编辑2:
它似乎是一个默认阈值,它将导致vb.net忽略某些SQL异常(无法理解这种决定背后的基本原理)。无论如何,我认为如果您执行以下操作,您应该会看到引发的异常。

cmd.FireInfoMessageEventOnUserErrors = true;

结束EDIT2

编辑:我刚才把问题读得更近了。如果vb.net执行完全没有抛出任何异常,那表明你没有在两者中运行完全相同的语句。我最初的猜测是你传递了一个日期参数,它将SQL Plus字符串变量错误地传递为01/01/2015(1除以1除以2015)和vb.net变量正确地传递为{{1} (即带有引号的字符串)。
结束编辑

我不知道你的意思是"在merge语句"中使用日志错误,但听起来你只需要使用vb.net try-catch语法来捕获和处理Oracle的语法错误。

从这里开始:http://www.tek-tips.com/viewthread.cfm?qid=467119

相关代码段:

'01/01/2015'