Sql server ADODB不';t在VBA中引发SQL错误
我注意到,当在VBA中运行查询时,VBA并不总是通知它所引发的错误。例如,如果我尝试在不接受null的行中使用null值执行大容量插入,则在SQL Server中会出现以下错误: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
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方法。