2015-08-17 2 views
1

Я хотел бы попросить некоторую помощь, вот контекст: я использую книгу Excel, подключенную к моему SQL Server с ODBC, поэтому пользователь может ее использовать для создания некоторых запросов с использованием некоторых кнопок макросов +.Как отобразить ошибку синтаксиса SQL из пользовательской формы Excel VBA

Он спросил меня, возможно ли создать интерфейс между Excel и SQL Server, например, если вы используете СУБД, показывая пользовательскую форму для ввода запроса, и если вы получите некоторую синтаксическую ошибку, она будет показана тебе).

Вот моя проблема: я успешно создал интерфейс, но не могу показать Синтаксическую ошибку. Появляется только сообщение: «Ошибка времени выполнения» 1004 «Синтаксическая ошибка SQL».

Возможно ли показать точное сообщение, как если вы используете СУБД?


Чтобы было легче понять, вот мой код:

Function Query(SQL As String) 

On Error GoTo Err_handler 

    With ActiveSheet.QueryTables.Add(Connection:= _ 
     "ODBC;DSN=mydb;Description=test;UID=test;PWD=test;APP=Microsoft Office 2003;WSID=test123" _ 
     , Destination:=Range("A1")) 
     .CommandText = (SQL) 
     .Name = "test" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .BackgroundQuery = True 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .PreserveColumnInfo = True 
     .Refresh BackgroundQuery:=False 
    End With 

    Exit Function 

Err_handler: 
    MsgBox Err.Number & " - " & Err.Description 

End Function 

Заранее спасибо!

+0

Я думаю, что вам нужно разместить свой код для получения дополнительной информации. Возьмите [тур] (http://stackoverflow.com/tour) для этого сайта. –

+0

Привет, Николас, спасибо за ваше предложение, я отредактировал сообщение. –

ответ

0

Вам необходимо использовать что-то вроде библиотеки ActiveX Data Objects (ADODB), чтобы получить конкретную информацию о соединении. Поэтому, когда вы запускаете код, SQL вызывает ошибку для объекта ADO, но тогда объект Err будет содержать информацию об ошибках, специфичную для SQL, вырвавшую из базы данных.

Вам необходимо добавить Reference в ActiveX Data Objects в проект VBA. Как только вы это сделаете, попробуйте это: -

Function MyQuery(SQL As String) 

    Dim cn As ADODB.Connection 
    Dim cmd As ADODB.Command 
    Dim rs As ADODB.Recordset 

    On Error GoTo Err_handler 

    'DB Connection Object 
    Set cn = New ADODB.Connection 
    cn.Open "DSN=mydb;Description=test;UID=test;PWD=test;APP=Microsoft Office 2003;WSID=test123" 

    'SQL Command Object 
    Set cmd = New ADODB.Command 
    cmd.ActiveConnection = cn 
    cmd.CommandType = adCmdText 
    cmd.CommandText = SQL 

    'Recordset Object to contain results 
    Set rs = cmd.Execute 

    With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1")) 
    .Name = "test" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .PreserveColumnInfo = True 
    .Refresh BackgroundQuery:=False 
    End With 

MyQueryx: 

    'Clean up - close connections and destroy objects 
    If Not rs Is Nothing Then 
    If rs.State = ADODB.adStateOpen Then 
     rs.Close 
    End If 
    Set rs = Nothing 
    End If 

    If Not cmd Is Nothing Then 
    Set cmd.ActiveConnection = Nothing 
    Set cmd = Nothing 
    End If 

    If Not cn Is Nothing Then 
    If cn.State = ADODB.adStateOpen Then 
     cn.Close 
    End If 
    Set cn = Nothing 
    End If 

    Exit Function 

Err_handler: 
    MsgBox Err.Number & " - " & Err.Description 
    'Goto to the function exit to clean up 
    GoTo MyQueryx 

End Function 
+0

Я думаю, что это не правильный ответ на вопрос. Пожалуйста, прочитайте еще раз. Он знает ошибку, он хочет показать сообщение об ошибке, которое поступает из базы данных. –

+1

Это правильный ответ. Ошибка будет поднята на объекте «RecordSet», и поэтому объект «Err» полностью заполнит ошибку SQL. – joehanna

+0

Привет, Джоанна, спасибо за ваш ответ. Я попытался добавить свой код к моему, но теперь я получил это сообщение об ошибке: Имя источника данных не найдено, а указатель по умолчанию не указан Странная часть состоит в том, что с тем же кодом, который используется в соединении, я могу подключиться в «старый путь» обычно. Вы знаете, что чего-то не хватает? И только для вас, чтобы знать, эта часть кода (cn.Close) он получает сообщение с кодом об ошибке 3004. Если не сп ничего после этого Если cn.State <> ADODB.adStateOpen Тогда cn.Close End If Set cn = Nothing End If –