Sql server ADODB不';t在VBA中引发SQL错误

Sql server ADODB不';t在VBA中引发SQL错误,sql-server,vba,Sql Server,Vba,我注意到,当在VBA中运行查询时,VBA并不总是通知它所引发的错误。例如,如果我尝试在不接受null的行中使用null值执行大容量插入,则在SQL Server中会出现以下错误: Msg 4869, Level 16, State 1, Line 1 The bulk load failed. Unexpected NULL value in data file row 2, column 7. The destination column (IFSFxRate) is defined as N

我注意到,当在VBA中运行查询时,VBA并不总是通知它所引发的错误。例如,如果我尝试在不接受null的行中使用null值执行大容量插入,则在SQL Server中会出现以下错误:

Msg 4869, Level 16, State 1, Line 1
The bulk load failed. Unexpected NULL value in data file row 2, column 7. The destination column (IFSFxRate) is defined as NOT NULL.
然而,当我使用ADODB执行它时,它不会引发任何错误,尽管我注意到如果我使用rs.NextRecordset,我会得到一个带有错误消息的调试窗口

Public Sub ExecuteQuery(sql As String)    Dim Error As ADODB.Error
    Dim Error As ADODB.Error
    Dim rs As ADODB.recordset
    Dim Conn As New ADODB.Connection
    Conn.CommandTimeout = 0
    Call Conn.Open(ConfigFactory.DB_CONNECTION)
    Set rs = Conn.Execute(sql) ' "raiserror ('xyz', 10, 127)"
    Debug.Print Conn.Errors.Count ' Returns 0
    rs.NextRecordset ' The bulk load failed. Unexpected NULL value in data file row 2
    Connection.Close
    Set Connection = Nothing
End Sub

为什么没有在.Execute上引发错误?在这些情况下,我可以做些什么来获取日志吗?

SQL Server with ADO将为返回的每个“结果集”生成一个记录集

也就是说,对于批处理中生成“受影响的行”输出或输出行集的每条语句。您必须使用
Set rs=rs.NextRecordSet
翻阅结果

每个错误都附加到一个单独的语句中,因此在到达该语句的结果集之前,它们可能不会在客户端上处理(并添加到
连接
对象)

通常情况下,您对空结果集不感兴趣,因此您会看到代码中散布了以下内容:

While rs.EOF Do
  Debug.Print "Empty Recordset with " & rs.RecordCount & " rows affected"
  Set rs = rs.NextRecordset
Next
如果您感兴趣,可以通过查阅上述
RecordCount
属性来获取“受影响的行”信息


或者,您可以通过在SQL语句(或存储过程)中使用
SET NOCOUNT ON
来抑制空记录集。

是否在错误恢复下设置了
?否,这就是全部代码。它确实会通知一些错误,我已经读了一些,SQL Server似乎有错误,并且在批量插入过程中出现了错误。然而,我添加了一个用户定义的错误,但仍然一无所获。对于有相同问题的人,设置NOCOUNT ON就可以解决问题。不过,我无法获取多个记录集并使用NextRecordset方法。