Opis problemu
Czasami, aby dokonać aktualizacji bazy chcemy mieć wyłączny dostęp do pliku z danymi. Problem pojawia się w momencie kiedy ktoś używa pliku, a nie wiemy kto. Oczywiście powodów wyłączności może być więcej, ale odcinanie użytkowników od danych podczas pracy to proszenie się o kłopoty.
Sam JET informacje o blokadach na pliku przechowuje w pliku ldb lub dla wersji od 2007 w pliku laccdb. Sama informacja w nim zawarta, może być przydatna, ale nie można opierać na niej wiedzy o tym kto jest zalogowany, ponieważ aparat bazy nie usuwa informacji o zwolnieniu blokady. Dobrze opisuje to ten artykuł:
Wprowadzenie to.ldb plików w programie Access 2000
Wskazówka! Podejrzeć zawartość pliku można wykonać poprzez otworzenie go w systemowym notatniku.
Rozwiązanie
Opis rozwiązania jest w tym artykule: How to determine who is logged on to a database by using Microsoft Jet UserRoster in Access 2000
W sumie mógłbym na tym skończyć ten wpis, ale postanowiłem się podzielić swoim narzędziem.
Cel jego powstania był prosty: czasami back-end jest na komputerze/serwerze na którym nie ma MsAccess’a. W pierwszej wersji był to skrypt VBScript, ale ze względu na problemy (zależność od systemu operacyjnego) z dialogiem do wybierania pliku, napisałem go w AutoIt.:
Local $var = FileOpenDialog("Wybierz plik bazy danych", @WorkingDir & "\", "Access 2000-2003 (*.mdb)|Access 2007 (*.accdb)", 1 + 4) If not @error Then $var = StringReplace($var, "|", @CRLF) $cn = ObjCreate("ADODB.Connection") If StringRight($var,3)="mdb" Then $cn.Provider = "Microsoft.Jet.OLEDB.4.0" Else $cn.Provider = "Microsoft.ACE.OLEDB.12.0" EndIf $cn.Open($var) $rs = $cn.OpenSchema(-1,Default,"{947bb102-5d43-11d1-bdbf-00c04fb92675}") $file=FileOpen(@ScriptDir & "\WhoOnLine.txt", 2) FileWriteLine($file,"Uzytkownicy zalogowani do bazy:" & $var) FileWriteLine($file,"-----------------------------------------------------------------------") FileWriteLine($file,$rs.Fields(0).Name & @TAB & $rs.Fields(1).Name & @TAB & $rs.Fields(2).Name & @TAB & $rs.Fields(3).Name) While Not $rs.EOF FileWrite($file,$rs.Fields(0).value & @TAB) FileWrite($file,$rs.Fields(1).value & @TAB) FileWrite($file,$rs.Fields(2).value & @TAB) FileWrite($file,$rs.Fields(3).value) FileWrite($file,@CRLF) $rs.MoveNext Wend FileClose($file) run("notepad.exe """ & @ScriptDir & "\WhoOnLine.txt") $rs.close $cn.close EndIf
Działanie jest proste:
1. Wskazuje ścieżkę do pliku mdb/accdb
2. Zależnie od typu bazy wybieram odpowiedniego providera
3. Tworzę plik wynikowy w folderze skryptu
4. Czytam informacje o zalogowanych użytkownikach
5. Otwieram wygenerowany plik w notatniku
Cała reszta wiedzy jest w artykule powyżej.
Podsumowanie
Dla zainteresowanych wersja skompilowana exe jak i sam skrypt do pobrania, ze swojej strony zachęcam do zapoznania się ze środowiskiem skryptowym AutoIt, bardzo przydatne do robienia narzędziowych skryptów i kompilowania do plików wykonywalnych exe.
0 Comments.