sqlite

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Kuster Peter
Beiträge: 205
Registriert: So 2. Dez 2007, 20:47
OS, Lazarus, FPC: Windows XP Lazarus immer neueste Version
CPU-Target: xxBit
Wohnort: Schweiz

sqlite

Beitrag von Kuster Peter »

Mit was soll ich sqlite verbinden, mit zeos oder den Komponenten von Lazarus. Hat da jemand Erfahrung.

Peter

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: sqlite

Beitrag von Poelser »

Kuster Peter hat geschrieben:Mit was soll ich sqlite verbinden, mit zeos oder den Komponenten von Lazarus.
Solange es sich um eine Desktop-Applikation handelt, würde ich die ZEOS-Komponenten nehmen. Das Handling dieser Komponenten ist besser als das der Lazarus-Komponenten.

Wenn du allerdings mit dem Gedanken spielst, deine Applikation mal auf WINCE laufen zu lassen, kommst du um die Lazarus-Komponenten nicht herum - ZEOS gibt's (noch?) nicht für Laz/WINCE.

HTH, der Poelser

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: sqlite

Beitrag von Christian »

Das mit WinCE funktioniert auch mit sqldb nicht. Ich würde dir auf jeden Fall zu ZeOS raten.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: sqlite

Beitrag von Poelser »

Christian hat geschrieben:Das mit WinCE funktioniert auch mit sqldb nicht.
Nö, funktioniert. An einigen Stellen etwas hakelig zu programmieren, aber läuft.
Natürlich braucht's dazu eine für WINCE compilierte sqlite3.dll, die findet man aber im Netz.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: sqlite

Beitrag von Christian »

mit den sqlite Komponenten oder sqldb ?? Das wär mir neu hab schon öfter von problemen diesbezüglich gelesen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: sqlite

Beitrag von Poelser »

Also, ich benutze von der Registerkarte SQLdb:

TSQLite3Connection, TSQLQuery, TSQLTransaction

Datenbanksensitive Komponenten benutze ich nicht, Daten holen und speichern nur über die SQLQuery. Was hakelig ist, ist immer wieder das Starten und Beenden von Transactions, besonders unübersichtlich ist es dann, wenn in einer Schleife über eine Query zwischendrin Datensätze geschrieben werden müssen. Oder dieser hier:

Code: Alles auswählen

if Query.Active then Query.Close;
    Query.SQL.Text := 'HIER EIN STATEMENT AUF TABLEXYZ';
    Query.Open;
    Query.First;
...
    Query.Close;
...
    DM.con1.Transaction.Active:=False;    <- Und das nervt gewaltig! Vergisst man das, kann man die merkwürdigsten Fehlermeldungen bekommen...
    tmps := 'INSERT INTO TABLEXYZ';
    DM.con1.ExecuteDirect(tmps);
    DM.con1.Transaction.Commit;
Es gibt noch ein paar Stolpersteine mehr. Anfangs wär ich bald durchgedreht, gerade weil die Fehlermeldungen total unsinnig oder unverständlich waren. Das Transaction-Gehampel bekommt man damit aber ziemlich zuverlässig in den Griff: Eine Connection nur zum Lesen von Daten benutzen, eine zweite nur zum Schreiben von Daten.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: sqlite

Beitrag von mse »

Poelser hat geschrieben:Das Transaction-Gehampel bekommt man damit aber ziemlich zuverlässig in den Griff: Eine Connection nur zum Lesen von Daten benutzen, eine zweite nur zum Schreiben von Daten.
SQLite3 Transaktionen sind etwas speziell, da sie mit file locks arbeiten. tmsesqlite3connection (MSEgui) hat daher ein spezielles flag (options slo_transactions, standardmässig aus) für die Aktivierung von Transaktionen. Ebenfalls wissen muss man, dass ein nicht abgeschlossener Lesevorgang (TSQLQuery.PacketRecords <> -1, nicht alle Datensätze geladen) die DB für Schreibvorgänge sperrt.

Martin

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: sqlite

Beitrag von Socke »

Ich arbeite halbwegs (d.h. immer wenn ich Lust darauf habe) erfolgreich mit den Lazarus-Komponenten, wobei ich die Probleme, die Poelser hatte, nicht gehabt habe.

Code: Alles auswählen

{ Benötigt wird je eine TSqlite3Connection, TSqlQuery und TSqlTransaction }
  DbConnection.Open; // muss man nur einmal (beim ersten Zugriff auf die DB) machen
  if DbConnection.Connected then begin
    with DbQuery do begin
      SQL.Text := 'SQL-STMT ohne RESULT-SET';
      ExecSQL;
    end;
    DbTransaction.Commit; // immer, wenn Änderungen in der DB gespeichert werden sollen
// oder auch
  with DbQuery do begin
    SQL.Text := 'SELECT something FROM somewhere';
    Open; // nur bei einer query mit result set
    First;
    while not EOF do begin
      writeln(Fields[0].AsString);
    end;
  end;
MfG Socke
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: sqlite

Beitrag von Poelser »

Hast du verschachtelte Queries, in denen auch noch Daten geschrieben werden? Da tauchen die Probleme immer auf. Wie mse geschrieben hat, scheint das Problem auf filelocks zu basieren. Wenn die ganze DB statt einer Tabelle gelockt wird, wird's bei Verschachtelungen natürlich problematisch.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: sqlite

Beitrag von Socke »

Poelser hat geschrieben:Hast du verschachtelte Queries, in denen auch noch Daten geschrieben werden? Da tauchen die Probleme immer auf. Wie mse geschrieben hat, scheint das Problem auf filelocks zu basieren. Wenn die ganze DB statt einer Tabelle gelockt wird, wird's bei Verschachtelungen natürlich problematisch.
Bisher noch nicht, aber meine Programme sind bisher recht einfach gehalten, sodass solche Situationen durch entsprechendes Design verhindert werden können (ist natürlich etwas ganz anderes bei Multithreading).

So wie ich die Komponenten angeschaut habe, müsste sich das Verhalten (ganze DB/nur Tabelle locken) steuern können lassen (wobei ich durch die eher gering ausfallende Dokumentation mich auch noch nicht so massiv damit beschäftigt habe).

MfG Socke
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: sqlite

Beitrag von Christian »

Du kannst bei sqlite keine einzelne tabelle locken. sobald geschrieben wird ist die gesamte datenbank gelockt.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten