我如何在Access或Excel中最好使用VBA来测试ODBC连接?(How can I best

2019-09-30 03:00发布

给定一个预先配置的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。 这工作得很好,但感觉......缺憾。 有没有更优雅的方式,尤其是一个不依赖于对错误转到

注:这是一个传统的Access 2000数据库我的工作,所以任何解决方案不能有任何Access 2007或2003的依赖。 我想使通用的VBA,但如果有在访问一个简单的方法,那也没关系。

非常感谢您的任何意见。

Answer 1:


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;”
看看这个连接字符串



Answer 2:

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

......事实证明,答案是“否”,所以我会张贴参考代码:别人会觉得它有用。

编码注释:这不是一个通用的答案:这是从一个类封装ADODB.Connection对象的方法,它假定对象的存在“m_objConnect”。

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

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

公用Sub TestConnection()对错误转到ErrTest

暗淡我作为整数

如果m_objConnect是Nothing然后

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

其他

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

万一

ExitTest:退出小组ErrTest:Debug.Print “错误” &Err.Number的&&&Err.Source “通过提出” “:” &Err.Description继续下一步

结束小组

专用功能ObjectStateString(ObjectState作为ADODB.ObjectStateEnum)作为字符串

选择案例ObjectState案例ADODB.ObjectStateEnum.adStateClosed ObjectStateString = “关闭” 案例ADODB.ObjectStateEnum.adStateConnecting ObjectStateString = “连接” 案例ADODB.ObjectStateEnum.adStateExecuting ObjectStateString = “执行” 案例ADODB.ObjectStateEnum.adStateFetching ObjectStateString = “读取” 个案ADODB。 ObjectStateEnum.adStateOpen ObjectStateString =“打开”案例否则ObjectStateString =“国家”和CLng函数(ObjectState)“:未知状态号”结束选择

结束功能

分享和享受:并观看了换行符,有益插在那里他们将通过您的浏览器(或StackOverflow上的格式化功能)破解密码。



Answer 3:

有没有神奇的功能,这将考验,而又没有实际连接,并试图操作。

如果你觉得不好的随机查询部分 - 你可以查询系统表

对于Access

SELECT TOP 1 NAME FROM MSysObjects 

对于SQL Server

SELECT TOP 1 NAME FROM sysobjects 


Answer 4:

如果你仅仅需要测试数据库服务器实际上是可用的,这是可以做到,尽管这里正在它不能说。

在这种情况下,您可以尝试打开一个TCP连接到特定的服务器和端口。 SQL Server的默认实例,例如,监听TCP端口1433试图在VBA一个简单的TCP连接会告诉你,如果它成功与否上。 只有当这是成功的我会查询使用ODBC连接。

这是一个很大的优雅和高效。 它会从你的ODBC测试代码删除任何“严重”的错误。 然而,正如我所说,它,如果你需要测试数据库服务器实例仅仅存在/可用性才适用。



文章来源: How can I best use VBA in Access or Excel to test an ODBC connection?