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。
任何想法?
一个很好的解决方案可以在这里找到:
ACC 2000:如何捕获ODBC登录错误消息 http://support.microsoft.com/kb/210319
以上是从Access 2000和是14岁,但因为这样它今天仍然正常工作。另一个可能的好处是你不必采用ADO并将其引入到你的应用程序中。对于已经使用或具有ADO的应用程序,则没有什么大不了的,但如果您的应用程序坚持使用一个数据对象模型,那么您就不必引入ADO。
上述的其他BIG奖金是这有效地将您登录到数据库中,因此您可以避免在链接表中拥有用户名和密码。这意味着您可以拥有不同的用户和登录名,而不必将链接表中的用户名或密码重新链接或嵌入。
这个奇妙的伎俩,并导致上述连接招的是这里概述:
电源设计小贴士:改善
谢谢,那就是我一直在寻找的。我同意,能够使用相同的数据对象模型而不是引入第二个数据对象更加简单。我很欣赏答案! – 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
你重新启动SQL Server数据库连接的安全性,是它当前正在运行在尝试连接之前? – Juniar 2014-10-07 05:52:10
不,我知道它没有运行 - 这就是我想要在代码中捕获的。这不是'确保SQL服务器正在运行'的问题,而是'如果SQL服务器没有运行,我该如何优雅地从中恢复呢?' – LMF 2014-10-07 22:27:03
错误应该来自连接字符串,因为服务器没有运行。我想你把它放在一个try和catch块。 – Juniar 2014-10-08 00:55:05