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

给定一个预先configuration的ODBC系统DSN,我想写一个函数,优雅地testing使用VBA的连接。

Private Function TestConnection(ByVal dsnName As String) As Boolean ' What goes here?? ' End Function 

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

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

注意:这是我正在使用的传统Access 2000数据库,所以任何解决scheme都不能有任何Access 2007或2003依赖项。 我想使它对VBA是通用的,但是如果在Access中有一个简单的方法,那也可以。

非常感谢任何build议。

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
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;”
看这个连接string

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

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

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

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

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


Public Sub TestConnection()
在错误转到ErrTest

昏暗我作为整数

如果m_objConnect没有那么

 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“Error”&Err.Number&“raised by”&Err.Source&“:”&Err.Description
继续下一步

结束小组

私人函数ObjectStateString(ObjectState作为ADODB.ObjectStateEnum)作为string

select大小写对象状态
大小写ADODB.ObjectStateEnum.adStateClosed
ObjectStateString =“closures”
大小写ADODB.ObjectStateEnum.adStateConnecting
ObjectStateString =“正在连接”
大小写ADODB.ObjectStateEnum.adStateExecuting
ObjectStateString =“执行”
大小写ADODB.ObjectStateEnum.adStateFetching
ObjectStateString =“获取”
大小写ADODB.ObjectStateEnum.adStateOpen
ObjectStateString =“打开”
其他情况
ObjectStateString =“State”&CLng(ObjectState)&“:未知状态编号”
结束select

结束function

分享并享受:注意换行符,帮助插入他们将通过浏览器(或通过StackOverflow的格式化函数)破坏代码的地方。

没有魔术的function,将testing这个没有实际连接和尝试一个操作。

如果您对随机查询部分感觉不好 – 您可以查询系统表

对于Access

 SELECT TOP 1 NAME FROM MSysObjects 

对于SQL Server

 SELECT TOP 1 NAME FROM sysobjects 

如果您只需testing数据库服务器是否可用,则可以完成此操作,尽pipe此处所述的内容不能。

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

这是更优雅和高效。 它会从您的ODBCtesting代码中删除任何“严重”的错误。 但是,正如我所说的,只有在您需要testing数据库服务器实例的存在/可用性时才适用。