Hallo Gemeinde,
ich habe in Programm erstellt, dass aus einer Access-Datenbank Informationen ausliest sowie hinein schreibt.
Ddiese Db liegt auf einem Netzwerklaufwerk. Wenn jemand nun die Db aber manuell geöffnet haben sollte, kann mein Proggi unter Umständen
dann nicht damit arbeiten.
Hätte jemand eine Idee ob man feststellen kann, ob die Datei bereits benutzt wird und wenn ja, wie könnte ich erzwingen das die Datei dann geschlossen wird?
Oder gibt es eine Möglichkeit die MS-Access-Datei so zu konfigurieren das eine Mehrfachnutzung möglich ist (konnte nichts bei Google dazu finden...)?
Schliessen geöffneter Datei
-
hipfzwirgel -
16. Juni 2023 um 10:32 -
Erledigt
-
-
Ich habe dazu folgendes gefunden: https://support.microsoft.com/en-au/office/w…2a-68da245a0446
Alternativ teste mal ob dir das hilft: https://www.autoitscript.com/forum/topic/12…&comment=853798
-
Hallo!
Mit psfile.exe kannst Du Dir anzeigen lassen bzw. auch geöffnete Files schliessen: https://learn.microsoft.com/en-us/sysinter…ownloads/psfile
lg
Racer
-
das Thema ist zwar schon 1 Monat alt., aber schau doch mal in der Access DB unter Datei -> Optionen -> Clienteinstellungen -> Erweitert bei dem Punkt Standartöffnungsmodus. Da nutzen wir immer den Punkt "Freigegeben".
Theoretisch kann du auch eine Haupt DB anlegen und machst dann nach Änderungen immer eine Export (per Makro) der Haupt DB in eine zweite DB. Mit der zweiten können dann die User arbeiten.
Änderungen sollten dann immer in der Haupt DB gemacht werden.
Gruß gmmg
-
Hallo Gmmg,
zunächst danke ich für die Tipps. Die Db wird schon im Freigegebenen-Modus geöffnet. Das scheint aber die DB-Treiber nicht zu interessieren, da es immer wieder zu Fehlern kommt wenn die DB geöffnet ist und das Proggi
via ADODB-Treiber darauf zugreifen will. Ich habe es testweise schon mit der Teilung der DB versucht aber damit kommen die ADODB-Treiber gar nicht zurecht. Auf die Tabellen ist dann keine Zugriff mehr möglich...
Das mit der Haupt.- und 2.-Db halte ich nicht für zielführend denn wie sollten von Usern gemachte Änderungen in die HauptDb kommen und außerdem wäre das datentechnisch sehr inkonsistent...
Vielleicht hat jemand ja noch eine Idee dazu wie ich die Db so konfiguriere, dass eine Mehrfachbenutzung insbesondere in Verbindung mit den ADODB-Treibern funktioniert? -
Hallo hipfzwirgel,
wenn da auch anderen User in der DB Änderungen machen, ist das natürlich schwierig.
Nutzt du eigentlich die Access.udf Link oder die per MS_AccessDB.au3?
Alternativ nochmal ein Beispiel als eingebundene Funktionen:
AutoIt
Alles anzeigen$dbname = "d:\test.accdb" _access_write($dbname) Func _access_write($dbname) $adoCon = ObjCreate("ADODB.Connection") $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $dbname & ";") $adoRs = ObjCreate("ADODB.Recordset") ;$adocon = ObjCreate("ADODB.Connection") ;$adocon.open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $dbname) ;$adors = ObjCreate("ADODB.Recordset") Local $sQuery = "INSERT INTO TB1 (`Name`,`Vorname`) VALUES ('Nachname','Vorname')" ;Local $sQuery = 'UPDATE TB1 SET [01_MA].SID = "' & $sid & '" WHERE [01_MA].PC = "' & $ssamaccountname & '"' $adoCon.Execute($sQuery) $adoCon.Close EndFunc ;$sQuery = "INSERT INTO tabelle_xyz (`Feld1`,`Feld2`,`Feld3`,`Feld4`) VALUES ('" & $s_wert[1] & "', '" & $s_wert[2] & "', '" & $s_wert[3] & "', '" & $s_wert[4] & "')" ;~ ;--------- Modify the variables below as desired or applicable ------- ;~ $dbname = "d:\dbtest.accdb" ;~ $tblname = "Tabelle1" ;~ $fldname01 = "Feld1" ;~ $format = "Text(50)" ;~ $fldname02 = "Feld2" ;~ $format = "Text(50)" ;~ $fldname03 = "Feld3" ;~ $format = "Text(50)" ;~ $fldname04 = "Feld4" ;~ $format = "Text(50)" ;~ $query = "SELECT * FROM "& $tblname & " WHERE xyz = '1004'" ;~ $strData1 = _ReadOneFld($query, $dbname, $fldname02) ;~ $strData2 = _ReadOneFld($query, $dbname, $fldname03) ;~ $strData3 = _ReadOneFld($query, $dbname, $fldname04) ;~ ;ConsoleWrite( $query & @crlf & "Ergebnis: " & $strData2) ;~ MsgBox(0,"",$query & @crlf & "Ergebnis: " & $strData1 & @CRLF & $fldname03 & ": " & $strData2 & @CRLF & $fldname04 & ": " & $strData3) ;~ ;------access DB auslesen ------------- ;~ Func _ReadOneFld($_sql, $_dbname, $_field) ;~ Dim $_output ;~ $adoCon = ObjCreate("ADODB.Connection") ;~ $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $dbname & ";") ;~ $adoRs = ObjCreate("ADODB.Recordset") ;~ $adoRs.CursorType = 1 ;~ $adoRs.LockType = 3 ;~ $adoRs.Open($_sql, $adoCon) ;~ With $adoRs ;~ If .RecordCount Then ;~ While Not .EOF ;~ $_output = $_output & .Fields($_field).Value & @CRLF ;~ .MoveNext ;~ WEnd ;~ EndIf ;~ EndWith ;~ $adoCon.Close ;~ Return $_output ;~ EndFunc ;==>_ReadOneFld
Gruß gmmg