Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Access-Datenbank gesperrt - Problem mit Windows-Update?

  Alt 7. Okt 2020, 16:22
Ich bitte vielmals um Entschuldigung für diesen Bump, aber es gibt wichtige Erkenntnisse:

Das hier ist mein Befehl zum Aufbau der Datenbankverbindung:
Delphi-Quellcode:
    db.Close;
    db.KeepConnection := HAL_Registry_GetBool('KeepConnection', True);
    db.LoginPrompt := False;
    db.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'
                       + 'Data Source=' + _FileName + ';'
                       + 'Mode=Share Deny None;'
                       + 'Persist Security Info=False;';
    db.Open;
Vor db.open ist
Code:
db.ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test\db.mdb;Mode=Share Deny None;Persist Security Info=False;
NACH db.open ist
Code:
db.ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\test\db.mdb;Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;
d.h. Delphi, Ado (oder wer auch immer) schreibt mir die ganzen Attribute in den ConnectionString rein, bzw. listet alle Eigenschaften auf, die über diese Api für diese Datenbankverbindung verfügbar sind. Diese Attribute kann man ja regulär z.B. über
db.Properties.Item['Mode'].Value setzen oder auslesen.

Kann es nun sein, dass eines dieser Attribute für den exklusiven Zugriff sorgt?

Jet OLEDB:Database Locking Mode=1 habe ich hier gefunden: https://docs.microsoft.com/de-de/sql...l-server-ver15 , es wird wohl der Datentyp DBPROP_JETOLEDB_DATABASELOCKMODE verwendet:
Zitat:
Jet OLEDB:Database Locking Mode (DBPROP_JETOLEDB_DATABASELOCKMODE) Indicates the locking mode for this database. The first user to open the database determines the mode used while the database is open.
Leider wird nicht erklärt, was für Werte zulässig sind. Auf https://docs.microsoft.com/en-us/pre...723619(v=vs.85) wird DBPROP_JETOLEDB_DATABASELOCKMODE beschrieben:
Zitat:
Type: VT_I4

Typical R/W: R/W

Description: Jet OLEDB:Database Locking Mode

Scheme to use when locking the database.

Constants:

DBPROPVAL_DL_OLDMODE ? Old mode used in previous releases of Jet's storage engine

DBPROPVAL_DL_ALCATRAZ ? Alcatraz mode. Enables locking mode that allows for row-level locking. This does not preclude page locking.

A database can be open in only one mode at a time. The first user to open the database determines the locking mode used while the database is open.
Leider fehlen hier die Delphi-Entsprechungen.

Eine Google-Suche bringt mich hier hin:
Zitat:
DBPROPVAL_DL_OLDMODE = 0 - Mode used in previous versions of the Jet database
DBPROPVAL_DL_ALCATRAZ = 1 - Mode used in Jet 4 and later, allowing row level locking
Scheinbar wird also meine Jet-Verbindung automatisch im Modus "Jet OLEDB:Database Locking Mode= 1 = DBPROPVAL_DL_ALCATRAZ = Mode used in Jet 4 and later, allowing row level locking" aufgebaut. Bedeutet das jetzt, dass MEHR oder WENIGER gesperrt wird, als vorher? Da es ja "row level locking" heißt, und das andere "oldmode", nehme ich an, dieser Modus ist neuer=besser=weniger gesperrt. Oder nicht? Wenn nicht, wäre es die Erklärung, wieso die Software auf dem ersten PC läuft, aber auf den Folgenden nicht: die Datenbank wäre dann durch den ersten PC exklusiv geöffnet. Ich denke mal aber nicht, dass Modus 1 das bewirkt, oder?

Gibt es noch andere Parameter für den Verbindungsaufbau, den ich berücksichtigen oder ändern muss, damit die Datenbank nicht exklusiv geöffnet ist?


Gerade eben hatte ich auch (lokal, mit nur einem PC, aber dafür 2 offenen TAdoConnection innerhalb der .exe) diese Meldung:
Zitat:
Datei konnte nicht gesperrt werden / SELECT TOP 1 * FROM T_Integer WHERE ID=:pID
Wieso, weshalb, warum jetzt das? Das ist eine nur-lesen Operation. Werden da jetzt auch schon die Datensätze gesperrt?


Edit:
-Wie kann ich prüfen, ob sich die aktuelle TAdoConnection in einem Exklusiven Modus befindet?
-Gibt es für TAdoQuery eine Einstellung, die einen exklusiven Zugriff bewirken?
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens ( 7. Okt 2020 um 17:54 Uhr)
  Mit Zitat antworten Zitat