如何在Access或Excel中最好地使用VBA来测试ODBC连接?

时间:2009-03-10 21:37:59

标签: excel ms-access vba odbc

鉴于预先配置的ODBC系统DSN,我想编写一个使用VBA优雅测试该连接的函数。

Private Function TestConnection(ByVal dsnName As String) As Boolean

    ' What goes here?? '

End Function

编辑:为了澄清,系统DSN指向外部SQL Server 2005数据库,使用Windows NT身份验证。

我尝试过的一种方法是将一些随机查询发送到目标数据库并捕获错误。如果查询有效,则返回true。如果有错误则返回false。这工作得很好,但感觉...... kludgy。是否有更优雅的方式,尤其是不依赖 On Error Goto 的方式?

注意:这是我正在使用的传统Access 2000数据库,因此任何解决方案都不能具有任何Access 2007或2003依赖项。我想把它变成VBA的通用,但如果在Access中有一个简单的方法也很好。

非常有必要提出任何建议。

4 个答案:

答案 0 :(得分:5)


Dim cnn As ADODB.Connection
Dim canConnect as Boolean
Set cnn = New ADODB.Connection

cnn.Open "DSN HERE"
If cnn.State = adStateOpen Then
    canConnect = True
    cnn.Close
End If

Msgbox canConnect

编辑:DSN格式可以是“DSN = MyDSN; UID = myuser; PWD = myPwd;”
查看this连接字符串

答案 1 :(得分:2)

我来不及给你一个有用的问题答案,但我来这里因为我想看看StaCkOverflow是否比我目前用来测试的代码有更好的答案ADODB连接。

...事实证明答案是'不',所以我会发布代码供参考:其他人会发现它很有用。

编码说明:这不是一般答案:它是封装ADODB.Connection对象的类的方法,它假设存在对象'm_objConnect'。

TestConnection:用于发布ADODB.Connection对象的调试信息的VBA类方法

这将打印出连接字符串,当前状态,ADODB错误列表(如果有)以及onnection命名属性的完整列表。

Public Sub TestConnection() On Error GoTo ErrTest

Dim i As Integer

If m_objConnect Is Nothing Then

Debug.Print "Object 'm_objConnect' not instantiated."

Else

Debug.Print m_objConnect.ConnectionString
Debug.Print "Connection state = " & ObjectStateString(m_objConnect.State)

Debug.Print

If m_objConnect.Errors.Count > 0 Then
    Debug.Print "ADODB ERRORS (" & m_objConnect.Errors.Count & "):"
    For i = 0 To m_objConnect.Errors.Count
        With m_objConnect.Errors(i)
            Debug.Print vbTab & i & ":"  _ 
                      & vbTab & .Source & " Error " & .Number & ": " _ 
                      & vbTab & .Description & " " _ 
                      & vbTab & "(SQL state = " & .SqlState & ")"
        End With
    Next i
End If

Debug.Print

Debug.Print "CONNECTION PROPERTIES (" & m_objConnect.Properties.Count & "):"
For i = 0 To m_objConnect.Properties.Count - 1
    Debug.Print vbTab & i & ":" _ 
              & vbTab & m_objConnect.Properties(i).Name & " = " _ 
              & vbTab & m_objConnect.Properties(i).Value
Next i

End If

ExitTest: Exit Sub ErrTest: Debug.Print "Error " & Err.Number & " raised by " & Err.Source & ": " & Err.Description Resume Next

End Sub

Private Function ObjectStateString(ObjectState As ADODB.ObjectStateEnum) As String

Select Case ObjectState Case ADODB.ObjectStateEnum.adStateClosed ObjectStateString = "Closed" Case ADODB.ObjectStateEnum.adStateConnecting ObjectStateString = "Connecting" Case ADODB.ObjectStateEnum.adStateExecuting ObjectStateString = "Executing" Case ADODB.ObjectStateEnum.adStateFetching ObjectStateString = "Fetching" Case ADODB.ObjectStateEnum.adStateOpen ObjectStateString = "Open" Case Else ObjectStateString = "State " & CLng(ObjectState) & ": unknown state number" End Select

End Function

分享并享受:并注意换行符,在浏览器(或StackOverflow的格式化功能)打破代码的地方插入有用位置。

答案 2 :(得分:0)

没有神奇的功能可以在没有实际连接和尝试操作的情况下测试它。

如果您对随机查询部分感到不满意 - 可以查询系统表

访问

SELECT TOP 1 NAME FROM MSysObjects 

对于SQL Server

SELECT TOP 1 NAME FROM sysobjects 

答案 3 :(得分:0)

如果你只需要测试数据库服务器实际上是否可用,那么可以这样做,尽管这里说的不行。

在这种情况下,您可以尝试打开与特定服务器和端口的TCP连接。 例如,SQL Server的默认实例侦听TCP端口1433.在VBA中尝试简单的TCP连接将告诉您它是否成功。只有在成功的情况下,我才会使用ODBC连接进行查询。

这更加优雅高效。它会删除任何"粗略的" ODBC测试代码中的错误。但是,正如我所说,只有在您需要测试数据库服务器实例的存在/可用性时才适用。