2010-07-19 4 views
5

Je dois effectuer une opération de compactage et de réparation sur une base de données Access. Pour ce faire, toutes les connexions ouvertes à la base de données doivent être fermées. Malheureusement, il y a des connexions ouvertes que je ne peux pas toujours retracer et fermer correctement. Est-il possible de déconnecter toutes les connexions ouvertes par le biais du code?Déconnexion de toutes les connexions ouvertes à la base de données MS Access

Répondre

3

Il n'y a rien de particulier d'un fichier d'accès par rapport à-dire comme un fichier texte ou un simple fichier power point assis sur le disque. Nous parlons ici d'un fichier d'avion jane windows. Donc, votre vraie question est: pouvez-vous déconnecter un processus qui a un fichier Word ouvert ou tout autre fichier qui se trouve sur le disque dur?

Vous pourriez être en mesure de tuer le processus et la connexion, mais là encore vous ne seriez pas en mesure de vous assurer que les données en attente d'écriture dans ce fichier Word (ou accéder au fichier mdb) se produiraient. Donc, à ma connaissance, même si vous pouviez déterminer quel processus a ouvert ce fichier power point, je ne pense pas que vous pouvez tuer ce processus et fermer ce lien au fichier qui est ouvert et assurez-vous que les données en attente à écrire seront en fait écrites. Vous ne pouvez pas savoir ce que ce code et ce processus ont en attente en termes de mises à jour en attente d'être écrites sur le disque. Si l'échec d'écriture de données en attente dans un fichier Power Point peut ne pas être un gros problème, mais dans le cas des données, vous demandez des problèmes réels.

La seule vraie approche ici est une fermeture gracieuse et appropriée de l'application/processus qui a ce fichier Windows ouvert. Tout ce que votre code peut tenter est d'utiliser le fichier en exclusivité, et si vous ne pouvez pas le faire, vous devez informer l'utilisateur qu'un compact n'est pas possible avant l'utilisation exclusive du fichier peut être obtenu.

Vous pouvez certainement ouvrir les outils d'administration sur l'ordinateur, et vérifier les utilisateurs qui ont le fichier ouvert, mais la destruction de ces connexions est faite à vos risques et périls.

0

Je sais que c'est une réponse tardive, mais ici, je vais ...

Bien déterminer si les données ont été enregistrées est une autre préoccupation tout à fait, si ce n'est pas un problème, il y a plusieurs options disponibles en fonction votre configuration. En supposant que la base de données MS Access et que vous êtes sur un réseau Windows, et vous connaissez le nom de l'ordinateur (s) de connecté de l'utilisateur, cela peut être une option:

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 

Et puis de voir quels utilisateurs sont toujours connectés vous pouvez interroger la base de données JET en faisant quelque chose comme la procédure suivante outlined by Microsoft in a KB:

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 

J'espère que cela utile.

Questions connexes