2014-10-07 160 views
0

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

回答

0

一個很好的解決方案可以在這裏找到:

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

0

我最終發現了一些可以通過搜索「抑制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