MS Access VBA:使用workspace.OpenDatabase通过ODBC连接连接到不可用的SQL服务器 - 优雅的恢复?

时间:2014-10-07 05:35:04

标签: sql vba ms-access odbc jet

在使用MS Access表单作为某些SQL数据库的前端的应用程序中,我使用DBEngine.CreateWorkspace获取工作空间,然后使用workspace.OpenDatabase通过定义的ODBC系统DSN连接到我的远程SQL服务器。这一切都运行得很好,直到有人断开远程SQL机器与网络的连接,或关闭它,或其他类似的荒谬。 (注意:我知道这个设置有很多荒谬,但不幸的是,此时这是不可避免的)

我的问题是: 有没有办法优雅地处理超时和随后的“SQL Server不存在或访问被拒绝”错误消息,在VBA代码中出现? workspace.OpenDatabase抛出一个我可以捕获并处理的错误,但是在两个弹出窗口出现之前不会停止我的VBA代码,直到操作员单击OK。

DoCmd.SetWarnings False不影响它,因为错误弹出窗口实际上并非来自Access本身 - 我认为它们来自底层ODBC进程或驱动它的Jet引擎。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我最终通过搜索'抑制ODBC连接失败警告找到了可行的功能。

来自http://bytes.com/topic/access/answers/201502-how-suppress-odbc-connection-dialog

的Trevor Best的礼貌

某些代码使用ADO以允许VBA错误捕获的方式建立数据库连接,以便在系统向您抛出任何弹出窗口之前捕获错误。

Function CanOpenSQLDbLB(pstrServer As String, pstrDb As String, pstrUser
As String, pstrPassword As String, Optional pfReportError As Boolean =
True) As Boolean

On Error GoTo CanOpenSQLDbLB_Err

Dim objConn As Object
Dim strConn As String
Dim strError As String, lngErr As Long
Const cstrSQLErr = "[Microsoft][ODBC SQL Server Driver][SQL Server]"

Set objConn = CreateObject("ADODB.Connection")

strConn = strConn & "DRIVER=SQL Server"
strConn = strConn & ";SERVER=" & pstrServer
strConn = strConn & ";APP=" & Application.Name
strConn = strConn & ";WSID=AWorkstation"
strConn = strConn & ";DATABASE=" & pstrDb

objConn.Open strConn, pstrUser, pstrPassword

CanOpenSQLDbLB = True

CanOpenSQLDbLB_Exit:
On Error Resume Next
objConn.Close
Set objConn = Nothing
Exit Function
CanOpenSQLDbLB_Err:
lngErr = Err.Number
strError = Err.Description

If InStr(1, strError, cstrSQLErr) Then
strError = "Error reported by server" & vbCr & vbCr &
Replace(strError, cstrSQLErr, "")
End If

Select Case lngErr
Case Else
If pfReportError Then
MsgBox strError, 16, "Error #" & Err & " Attempting to
open server database"
End If
End Select
Resume CanOpenSQLDbLB_Exit

End Function

答案 1 :(得分:0)

这里可以找到一个好的解决方案:

ACC2000:如何捕获ODBC登录错误消息 http://support.microsoft.com/kb/210319

上述内容来自Access 2000,已有14年历史,但今天仍然可以正常使用。另一个可能的优点是您不必采用ADO并将其引入您的应用程序。对于已经使用或拥有ADO的应用程序,没什么大不了的,但如果您的应用程序坚持使用一个数据对象模型,那么您就不必介绍ADO。

上述的另一个巨大好处是,它可以有效地将您登录到数据库中,从而避免在链接表中使用用户名和密码。这意味着您可以拥有不同的用户和登录,而无需在链接表中重新链接或嵌入用户名或密码。

这个精彩的技巧和上述连接技巧的结果概述如下:

电源提示:提高数据库连接的安全性

http://blogs.office.com/b/microsoft-access/archive/2011/04/08/power-tip-improve-the-security-of-database-connections.aspx