Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQLite3 locked (https://www.delphipraxis.net/181267-sqlite3-locked.html)

matashen 31. Jul 2014 11:40

Datenbank: SQlite • Version: 3 • Zugriff über: dll

SQLite3 locked
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich schreibe in einer Anwendung die Daten mit SQlite.dll in eine Datenbankdatei.
Das Projekt ist schon etwas älter und wurde ursprünglich mit Delphi4 geschrieben und sqlite war die Version2.

Jetzt hab ich das Projekt umbauen müssen und dabei gleich mal die sqlite3.dll mit rein (wenns schon neueres gibt dann warum nicht)

Jetzt bekomm ich bei jedem Schreibzugriff auf die Datenbank aber eine Fehlermeldung(siehe angehängtes Bild).

wie behebe ich das?

Codeschnipsel:
Delphi-Quellcode:
 //Daten updaten
        sldb.BeginTransaction;
        sSQL:='UPDATE artikel SET ';
        sSQL:=sSQL+'tapeid="'+begurt.text+'"';
        sSQL:=sSQL+',beinfo="'+betext.text+'"';
        sSQL:=sSQL+',lort="'+belager.text+'"';
        sSQL:=sSQL+',notes="'+beinfotext.text+'"';
        sSQL:=sSQL+' WHERE sap="'+besap.text+'"';
        sldb.ExecSQL(sSQL);
        sldb.Commit;
ich habs dann auch versucht mit
sldb.execsql('BEGIN EXCLUSIVE TRANSACTION');
hat aber auch nichts gebracht.

Gruß Matthias

Der schöne Günther 31. Jul 2014 11:46

AW: SQLite3 locked
 
Sicher dass es an der anderen DLL liegt? Nicht dass du noch mit irgendeinem anderen Programm wie SQLite Expert die DB offen hast? Oder dem "Daten-Explorer" des RAD Studio? So hungrig wie das RAD Studio nach Filehandles ist (und sie nie freigibt)...

matashen 31. Jul 2014 11:48

AW: SQLite3 locked
 
Nein, ich hab sie nur einmal offen, greif mit nix anderem drauf zu

Klaus01 31. Jul 2014 12:22

AW: SQLite3 locked
 
.. wo liegt denn die Datenbank?
Ist da das Schreiben erlaubt?

Grüße
Klaus

mse1 31. Jul 2014 12:37

AW: SQLite3 locked
 
Auch ein nicht abgeschlossener Lesevorgang locked Sqlite3.

matashen 31. Jul 2014 13:16

AW: SQLite3 locked
 
Die Datei selbst liegt auf einem Netzlaufwerk mit Schreibrechten, hat ja auch mit der sqlite2 funktioniert.

Zitat:

Auch ein nicht abgeschlossener Lesevorgang locked Sqlite3.
und wie geb ich die wieder frei?

Der schöne Günther 31. Jul 2014 13:27

AW: SQLite3 locked
 
Zitat:

Zitat von matashen (Beitrag 1267151)
Die Datei selbst liegt auf einem Netzlaufwerk mit Schreibrechten, hat ja auch mit der sqlite2 funktioniert.

Uh.
http://www.sqlite.org/faq.html#q5:
Zitat:

But use caution: this locking mechanism might not work correctly if the database file is kept on an NFS filesystem. This is because fcntl() file locking is broken on many NFS implementations. You should avoid putting SQLite database files on NFS if multiple processes might try to access the file at the same time.
Und später:
Zitat:

When SQLite tries to access a file that is locked by another process, the default behavior is to return SQLITE_BUSY. You can adjust this behavior from C code using the sqlite3_busy_handler() or sqlite3_busy_timeout() API functions.


Auch: Ich verstehe das "Zugriff über: dll" nicht. Gehst du nun direkt über die dll oder (der Quellcode sieht eher danach aus) eine Zwischenschicht wie dbExpress oder FireDAC?

mse1 31. Jul 2014 13:46

AW: SQLite3 locked
 
Zitat:

Zitat von matashen (Beitrag 1267151)
Zitat:

Auch ein nicht abgeschlossener Lesevorgang locked Sqlite3.
und wie geb ich die wieder frei?

Den Lesevorgang abschliessen oder abbrechen. Wie greifst du auf die Sqlite3 API zu?

matashen 31. Jul 2014 14:02

AW: SQLite3 locked
 
Zitat:

Zitat von mse1 (Beitrag 1267157)
Zitat:

Zitat von matashen (Beitrag 1267151)
Zitat:

Auch ein nicht abgeschlossener Lesevorgang locked Sqlite3.
und wie geb ich die wieder frei?

Den Lesevorgang abschliessen oder abbrechen. Wie greifst du auf die Sqlite3 API zu?

ich geh direkt über die dll mit einer wraper class (unit)
Ich verwende kein dbExpress und kein FireDAC
Bei dbExpress ist die Unterstützung für sqlite meines Wissens erst ab XE3 drin und ich hab lediglich die XE2
Wenn man da die Unterstützung von sqlite durch dbexpress nachinstallieren kann wär das auch nicht schlecht.

Der Code zum lesen - nur relevanter Teil
Delphi-Quellcode:
if FileExists(slDBPath) then begin
    //Daten in Datenbank schreiben
    try
    sldb := TSQLiteDatabase.Create(slDBPath);
    try
       sltb := slDb.GetTable('SELECT * FROM tape WHERE [firstID]........
...........
    finally
      sltb.free;
    end;
    finally
      sldb.free;
    end;

matashen 31. Jul 2014 14:34

AW: SQLite3 locked - gelöst
 
Zitat:

Zitat von mse1 (Beitrag 1267149)
Auch ein nicht abgeschlossener Lesevorgang locked Sqlite3.

Der Hinweis war wichtig, das war mir nicht klar. Bin dann ins grübeln gekommen.

Ich hab jetzt den Codeteil gefunden wo ich zwar die Datenbank wieder frei gegeben habe, aber nicht vorher die Tabelle, und damit bleibts locked. Dies war in einem Codeteil der mit dem wo der Fehler auftritt nichts zu tun hat, aber bei bestimmten Aktionen auch Daten abgerufen werden.

Danke euch allen.

Gruß Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz