Как получить SQL Сведения об ошибке запроса при сбое QueryTable.Refre sh - PullRequest
1 голос
/ 21 февраля 2020

Скажем, у меня есть этот простой бит 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 подробности сообщения об ошибке?

Я посмотрел на следующее, но не могу найти ничего, что выскакивает там:

1 Ответ

1 голос
/ 21 февраля 2020

Чтобы вернуть указанные c ошибки от подключенного драйвера ODB C, рассмотрите возможность создания QueryTable из набора записей ADO, который обрабатывает SQL перед передачей в QueryTable. Как показывают QueryTables документы , аргумент connection может принимать различные формы, включая наборы записей (и даже пример в документации показывает, как такое подключение ADO набор записей):

Источник данных для таблицы запросов может быть одним из следующих:

  • Строка, содержащая строку подключения OLE DB или ODB C. Строка подключения ODB C имеет вид 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...