繁体   English   中英

如何从Excel VBA用户窗体显示SQL语法错误

[英]How to display SQL Syntax error from a Excel VBA Userform

我想寻求帮助,这是上下文:我正在使用一个通过ODBC连接到我的SQL Server的Excel工作簿,因此用户可以使用它使用一些宏+按钮进行一些查询。

他问我是否可以在Excel和SQL Server之间创建接口,例如您是否正在使用DBMS,显示用于键入查询的用户表单以及是否出现语法错误,它将显示给您。

这是我的问题:我已经成功创建了界面,但是无法显示语法错误。 仅显示消息:“运行时错误'1004'SQL语法错误”。

是否可以显示准确的消息,例如您是否正在使用DBMS?


为了更容易理解,这是我的代码:

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

提前致谢!

您需要使用ActiveX Data Objects库( ADODB )之类的东西,以便获取特定的连接信息。 因此,当您运行代码时,SQL将在ADO对象上引发错误,但是Err对象将包含从数据库冒泡的SQL特定错误信息。

您需要在VBA项目中添加对ActiveX Data ObjectsReference 完成此操作后,请尝试以下操作:-

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM