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

问题描述:

在使用MS Access表单作为某些SQL数据库的前端的应用程序中,我使用DBEngine.CreateWorkspace来获取工作区,然后使用workspace.OpenDatabase通过定义的ODBC系统DSN连接到我的远程SQL服务器。这一切都很好地工作,直到有人从网络上断开远程SQL计算机,或关闭它或其他类似的荒谬事情。 (注:我知道有很多荒谬的关于这一步,但不幸的是它是在这一点上的必然性)MS Access VBA:使用workspace.OpenDatabase通过ODBC连接连接到不可用的SQL服务器 - 优雅恢复?

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

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

任何想法?

+0

你重新启动SQL Server数据库连接的安全性,是它当前正在运行在尝试连接之前? – Juniar 2014-10-07 05:52:10

+0

不,我知道它没有运行 - 这就是我想要在代码中捕获的。这不是'确保SQL服务器正在运行'的问题,而是'如果SQL服务器没有运行,我该如何优雅地从中恢复呢?' – LMF 2014-10-07 22:27:03

+0

错误应该来自连接字符串,因为服务器没有运行。我想你把它放在一个try和catch块。 – Juniar 2014-10-08 00:55:05

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

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

以上是从Access 2000和是14岁,但因为这样它今天仍然正常工作。另一个可能的好处是你不必采用ADO并将其引入到你的应用程序中。对于已经使用或具有ADO的应用程序,则没有什么大不了的,但如果您的应用程序坚持使用一个数据对象模型,那么您就不必引入ADO。

上述的其他BIG奖金是这有效地将您登录到数据库中,因此您可以避免在链接表中拥有用户名和密码。这意味着您可以拥有不同的用户和登录名,而不必将链接表中的用户名或密码重新链接或嵌入。

这个奇妙的伎俩,并导致上述连接招的是这里概述:

电源设计小贴士:改善

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

+0

谢谢,那就是我一直在寻找的。我同意,能够使用相同的数据对象模型而不是引入第二个数据对象更加简单。我很欣赏答案! – LMF 2014-10-20 03:10:33

我最终发现了一些可以通过搜索“抑制ODBC连接失败警告”的方法。

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

使用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