2010-07-19 122 views
5

我需要在Access數據庫上執行壓縮和修復操作。爲了做到這一點,所有打開的數據庫連接都需要關閉。不幸的是,我有一些開放的連接,我不能一直追查並正確關閉。有沒有辦法通過代碼斷開所有打開的連接?斷開與MS Access數據庫的所有開放連接

回答

3

沒有什麼講究的訪問文件說相比到一個文本文件,或者一個簡單的電源點文件坐在磁盤上。我們在這裏討論的是一個平面jane窗口文件。

所以,你真正的問題是你可以斷開一個文件打開的進程或任何剛剛坐在硬盤上的舊文件?

您可能會終止進程和連接,但是您再次無法確保掛起的數據寫入該word文件(或訪問mdb文件)會發生。因此,就我所知,即使您可以確定哪個進程已打開該電源點文件,我不認爲您可以可靠地終止該進程並關閉連接到已打開的文件並確保該進程已關閉待寫入的數據實際上將被寫入。在等待寫入磁盤的更新方面,您無法知道該代碼和進程有何未決。

雖然在電源點文件中寫出未決數據可能不是什麼大不了的事情,但在數據的情況下,您要求真正的麻煩。

這裏唯一真正的方法是對windows文件打開的應用程序/進程進行優雅而正確的關閉。

關於你所有的代碼可以嘗試的是獲得文件的獨佔使用,如果你不能這樣做,那麼你必須通知用戶,緊湊是不可能的,直到獨佔使用該文件可以獲得。

您當然可以在計算機上打開管理工具,然後檢查打開文件的用戶,但是要終止這些用戶連接是需要您自擔風險的。

0

我知道這是一個遲到的答案,但在這裏我去...

雖然確定是否已經存儲了數據是另一個問題完全,如果這不是一個問題,有幾個可供選擇取決於你的設置。假設MS Access數據庫和你是一個Windows網絡上,並且您知道計算機名(一個或多個)的用戶登錄,這可能是一個選項:

Public Function StopProcess(PC As String) As Boolean 

    On Error GoTo Errhandler 

    Dim strComputer As String 
    Dim objWMIService As Variant 
    Dim colProcessList As Variant 
    Dim objProcess As Variant 

    ' Add the user domain 
    strComputer = PC & ".yourdomain.com" 
    Set objWMIService = GetObject(_ 
     "winmgmts:{impersonationLevel=impersonate}!\\" & _ 
     strComputer & "\root\cimv2") 
    Set colProcessList = objWMIService.ExecQuery(_ 
     "SELECT * FROM Win32_Process WHERE Name = 'msaccess.exe'") 

    ' Note: authority to do this must be provided prior for this function working 
    ' Also, note this kills all open MS Access database the user has open 
    For Each objProcess In colProcessList 
     Call objProcess.Terminate 
    Next 

Errhandler: 
    On Error Resume Next 
End Function 

然後看看哪些用戶仍登錄你可以通過執行類似下面的過程outlined by Microsoft in a KB查詢JET數據庫:

Dim cn As New ADODB.Connection 
Dim rs As New ADODB.Recordset 

cn.Provider = "Microsoft.Jet.OLEDB.4.0" 
cn.Open "Data Source=" & Path 

Set rs = cn.OpenSchema(adSchemaProviderSpecific, , _ 
         "{947bb102-5d43-11d1-bdbf-00c04fb92675}") 
If not rs.EOF Then 
    ' Note: Fields 0 = COMPUTER_NAME, 1 = LOGIN_NAME, _ 
    '    2 = CONNECTED, 3 = SUSPECT_STATE 
    Debug.Print rs.Fields(0) & " - " & _ 
       rs.Fields(1) & " - " & _ 
       rs.Fields(2) & " - " & _ 
       rs.Fields(3) 
End If 

我希望對您有所幫助。