【问题标题】:How to get SQL Query Error Details when QueryTable.Refresh failsQueryTable.Refresh 失败时如何获取 SQL 查询错误详细信息
【发布时间】:2020-02-22 00:05:16
【问题描述】:

假设我有一个刷新查询表的简单 VBA:

With aListObject.QueryTable
    .refresh BackgroundQuery:=False
End With

如果上表在刷新时从SQL引擎返回错误,那么如何获取实际的SQL错误详情?

例如我想要这种类型的消息,在 SQL Server Management Studio 中返回:

消息 8134,级别 16,状态 1,第 1 行
遇到除以零错误。

我可以向 VBA 添加错误处理以返回 VBA 错误:

On Error Resume Next    
With aListObject.QueryTable
    .refresh BackgroundQuery:=False
    if err.number > 0 then msgbox err.Description
End With
On Error GoTo 0

但这只会返回此消息:

SQL 语法错误

如何返回完整的 SQL 错误消息详细信息?

我查看了以下内容,但找不到任何内容:

【问题讨论】:

    标签: sql excel vba


    【解决方案1】:

    要从连接的 ODBC 驱动程序返回特定错误,请考虑从 ADO 记录集构建 QueryTable,该记录集在传递到 QueryTable 之前处理 SQL。正如QueryTables docs 所指出的,connection 参数可以采用多种形式,包括记录集(甚至文档中的示例也显示了这种 ADO 记录集连接方式):

    查询表的数据源可以是以下之一:

    • 包含 OLE DB 或 ODBC 连接字符串的字符串。 ODBC 连接字符串的格式为ODBC;<connection string>
    • 查询信息最初从中复制的 QueryTable 对象,包括连接字符串和 SQL 文本,但不包括 包括目标范围。指定 QueryTable 对象会导致 要忽略的 Sql 参数。
    • ADO 或 DAO 记录集对象。从 ADO 或 DAO 记录集中读取数据。 Microsoft Excel 保留记录集,直到查询表 被删除或连接被改变。结果查询表 无法编辑。

    ...


    使用错误处理调整 VBA:

    Sub Get_SQL_Data()
    On Error GoTo ErrHandle
        Dim conn As ADODB.Connection, rst As ADODB.Recordset
        Dim sqlstring As String, connstring As String
    
        ' OPEN CONNECTION
        Set conn = New ADODB.Connection
        connstring = "Driver={SQL Server}; ..."
        conn.Open connstring
    
        ' OPEN RECORDSET
        Set rst = New ADODB.Recordset
        sqlstring = "SELECT * FROM mytable"
        rst.Open sqlstring, conn
    
        With Worksheets("MAIN").QueryTables.Add( _
               Connection:=rst, _
               Destination:=Range("A1"))
           .Name = "SQL_DATA"
           .FieldNames = True
           .Refresh BackgroundQuery:=False
        End With
    
        rst.Close: conn.Close
    
    ExitHandle:
        Set rst = Nothing: Set conn = Nothing
        Exit Sub
    
    ErrHandle:
        MsgBox Err.Number & " - " & Err.Description, vbCritical, "RUNTIME ERROR"
        Resume ExitHandle
    End Sub
    

    【讨论】:

    • 感谢您的详细解答。使用 ABO 连接似乎是在将记录集插入查询表之前获取错误消息的好方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2011-03-07
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多