给定一个预先配置的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,但如果有在访问一个简单的方法,那也没关系。
非常感谢您的任何意见。
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;”
看看这个连接字符串
我来不及给你一个有用的回答你的问题,但我来到这里是因为我想看看是否计算器比我目前使用测试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上的格式化功能)破解密码。
有没有神奇的功能,这将考验,而又没有实际连接,并试图操作。
如果你觉得不好的随机查询部分 - 你可以查询系统表
对于Access
SELECT TOP 1 NAME FROM MSysObjects
对于SQL Server
SELECT TOP 1 NAME FROM sysobjects
如果你仅仅需要测试数据库服务器实际上是可用的,这是可以做到,尽管这里正在它不能说。
在这种情况下,您可以尝试打开一个TCP连接到特定的服务器和端口。 SQL Server的默认实例,例如,监听TCP端口1433试图在VBA一个简单的TCP连接会告诉你,如果它成功与否上。 只有当这是成功的我会查询使用ODBC连接。
这是一个很大的优雅和高效。 它会从你的ODBC测试代码删除任何“严重”的错误。 然而,正如我所说,它,如果你需要测试数据库服务器实例仅仅存在/可用性才适用。