AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TSQLiteDatabase: A SQLite3 Database Wrapper
Thema durchsuchen
Ansicht
Themen-Optionen

TSQLiteDatabase: A SQLite3 Database Wrapper

Ein Thema von HalloDu · begonnen am 17. Sep 2009 · letzter Beitrag vom 11. Nov 2016
Antwort Antwort
Seite 2 von 3     12 3      
HalloDu
Registriert seit: 24. Apr 2006
TSQLiteDatabase: A SQLite3 Database Wrapper
Kompatible SQLite3 Version: 3.6.16
TSQLiteDatabase ist ein nahezu vollständiger OOP-Wrapper um die SQLite3.dll. Er wurde erstellt da ich für eine Anwendung in Delphi 2009 ein kleine, freie Datenbank brauchte nd ich mich für SQLite entschieden hatte. Da ich aber für den Zugriff eine kleine, schlanke Klasse brauchte und mir die im Internet gefundenen Lösungen nicht gefallen haben, habe ich kurzerhand selbst einen Wrapper geschrieben. Zur Nutzung wird die SQLite3.dll benötigt

Features
Verbinden mit einer SQLite3 kompatiblen Datenbank
Ausführen von SQL-Statments
Bindings in den Statments
Erzeugen von Collations, Aggregaten und Funktionen
Fortschrittsereignis bei längeren Prozessen
Autorisieren von bestimmten SQL-Aktionen
Blob-Zugriff als Stream
Weiterarbeiten mit SQLite-internen Werten
Limits setzen
In Delphi 2009: Unicode
NoVCL kompatibel

Beispiele zur Benutzung
Zur Datenbank verbinden und ein "INSERT" ausführen
Delphi-Quellcode:
var DB: TSQLiteDatabase;
begin
  DB := TSQLiteDatabase.Create('test.db');
  DB.Execute('INSERT INTO TEST (TEST) VALUES ("TEST");');
  DB.Free;
end;
Ein "INSERT" mit Binding
Delphi-Quellcode:
var DB: TSQLiteDatabase;
    Command: TSQLiteCommand;
begin
  DB := TSQLiteDatabase.Create('test.db');
  Command := DB.Command('INSERT INTO TEST (TEST) VALUES (?);');
  Command.Binding[1].AsString := 'Test';
  Command.Execute;
  Command.Free;
  DB.Free;
end.
Auflisten der Daten einer Tabelle
Delphi-Quellcode:
var DB: TSQLiteDatabase;
    Query: TSQLiteQuery;
begin
  DB := TSQLiteDatabase.Create('test.db');
  Query := DB.Query('SELECT * FROM TEST');
  while Query.Next do
    begin
      WriteLn(Query[0].AsString);
    end;
  Query.Free;
  DB.Free;
end.
Beispiel mit vielen "INSERT"s
Delphi-Quellcode:
var DB: TSQLiteDatabase;
    Command: TSQLiteCommand;
begin
  DB := TSQLiteDatabase.Create('test.db');
  DB.Execute('BEGIN TRANSACTION'); // Damit nicht so viele Festplattenzugriffe gemacht werden müssen
  Command := DB.Command('INSERT INTO TEST (TEST) VALUES (?);');
  For I := 1 to 200 do
    begin
      Command.Reset;
      Command.Binding[1].AsString := 'Test'+IntToStr(I);
      Command.Execute;
    end;
  Command.Free;
  DB.Execute('END TRANSACTION');
  DB.Free;
end.
Getestet mit...
Delphi 2009 größtenteils, da ich es im Moment in einem Projekt einsetze
Delphi 7 rudimentär

SVN: svn://delphidev.net/public/SQLiteDatabase

Wäre klasse, wenn sich das wer von euch mal ansehen oder sogar ein bisschen testen könnte
Angehängte Dateien
Dateityp: zip sqlitedatabase_573.zip (48,1 KB, 363x aufgerufen)
 
HalloDu

 
Delphi 2009 Professional
 
#11
  Alt 15. Okt 2009, 21:57
Entschuldigung das ich mich erst heute wieder melde, hatte recht viel zu tun und das dann über die Arbeit etwas verpennt. Also was dein Problem angeht, so solltest du einfach ein simples Reset vor jedem neuverwenden des Statments aufrufen, dann sollte es gehn. Was die Performance angeht, so ist das Problem, dass wenn du 100 Einträge hinzufügst jedesmal ein Festplattenzugriff gemacht werden muss.
Delphi-Quellcode:
DB.Execute('BEGIN TRANSACTION');
//INSERTS, INSERTS, INSERTS
DB.Execute('END TRANSACTION');
beschleunigt das ganze enorm. (oben Beispiel hinzugefügt)

PS: Was die Interfaces angeht, so bin ich da noch nicht ganz durchgestiegen, es ist aber jeder angehalten, der möchte, sich in diesem Bereich an dem Projekt zu beteiliegen.
Frederic H.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
 
#12
  Alt 16. Okt 2009, 19:33
Also in meinem Fall so:

Delphi-Quellcode:
procedure TDatabase.AddFile(FileSpecs: TFileSpecs);
  var
    FileCmd: TSQLiteCommand;
  begin
    DB.Execute('BEGIN TRANSACTION');
    FileCmd := fDB.Command('INSERT INTO FILES (FILE_PATH, FILE_EXT, FILE_TITLE, FILE_ARTIST, FILE_ALBUM, FILE_YEAR, FILE_GENRE, FILE_LENGTH) ' +
                        'VALUES ( ? , ? , ? , ? , ? , ? , ? , ? );');
    FileCmd.Binding[1].AsString := FileSpecs.fFilePath;
    FileCmd.Binding[2].AsString := FileSpecs.fFileExtType;
    FileCmd.Binding[3].AsString := FileSpecs.fTitle;
    FileCmd.Binding[4].AsString := FileSpecs.fArtist;
    FileCmd.Binding[5].AsString := FileSpecs.fAlbum;
    FileCmd.Binding[6].AsString := FileSpecs.fYear;
    FileCmd.Binding[7].AsString := FileSpecs.fGenre;
    FileCmd.Binding[8].AsInteger := FileSpecs.fLength;
    FileCmd.Execute;
    FileCmd.Free;
    DB.Execute('END TRANSACTION');
  end;
oder?
米斯蘭迪爾
  Mit Zitat antworten Zitat
HalloDu

 
Delphi 2009 Professional
 
#13
  Alt 16. Okt 2009, 19:39
Das hätte keine Auswirkung auf die Performance. Du musst, wenn du weißt, dass das mehrere Inserts werden werden, diesen Prozess, z.B. eine For-Schleife, mit der Transaktion umgeben, siehe Beispiel oben. Das ist sowieso bei vielen Änderungen in der Datenbank zu empfehlen, und auch bei den meisten Datenbanken machbar. Wenn z.B. ein Problem auftritt, kannst du dann den ganzen Prozess mit einem Rollback wieder rückgängig machen, siehe dazu SQLite Doku
Frederic H.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
 
#14
  Alt 16. Okt 2009, 20:01
Ah, ok. Und wie genau war das mit dem Reset gemeint?
米斯蘭迪爾
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#15
  Alt 17. Okt 2009, 16:45
Ich nehme mal er meinte das so:
Code:
BEGIN TRANSACTION
  INSERT ...
  Schleife:
    Binds ...
    Exec ...
    Reset ...
COMMIT
Achso und warum muss man ".Execute('BEGIN TRANSACTION')" aufrufen? Also ich fand es total unpraktisch und habe es so implementiert, wie bei "BeginUpdate"/"EndUpdate". Weil wenn ich das richtig noch in Erinnerung habe, dann kann man nur einmal "Begin Transaction" aufrufen.

MfG
xZise
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

 
Delphi XE2 Professional
 
#16
  Alt 4. Mär 2011, 20:26
Hallöchen,

gibt es eigentlich eine aktuellere Version des Wrappers? Hat sich daran noch etwas getan?

Gruß

Wormid
  Mit Zitat antworten Zitat
dGeek
 
#17
  Alt 21. Jul 2016, 16:29
Ich habe mal ein wenig gebuddelt und das Thema hier gefunden.
Ich stelle mir gerade die Frage, ob ich von INI zu SQLite3 umstellen sollte oder eher nicht.

In einer INI-Datei meines Projektes können zwischen 1 und 100 Sektionen sein (in der Regel maximal 10) mit etwa (je nach Sektion) 20 bis 30 Schlüsseln.
Es wird relativ häufig auf die einzelnen Schlüssel zugegriffen. Eigentlich sogar immer - egal, was man bei meinem Projekt macht, wird irgendetwas ausgelesen.

Da stellt sich mir nun die Frage: weiterhin INI oder SQLite3?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#18
  Alt 21. Jul 2016, 16:51
Bau dir eine abstrakte Klasse, wo du die Werte abfragen kannst.

Dann dazu die konkrete für eine Ini-Datei (beim reinen Lesen bietet sich auf jeden Fall TMemIniFile an) und bei Bedarf weitere (die dann z.B. mit einer SQlite DB spricht).

Dann kannst du die auch direkt vergleichen, was dir genehmer ist oder was im konkreten Fall besser passt.

Eine Ableitung von TCustomIniFile die dann mit einer SQlite Datenbank spricht ist natürlich auch denkbar.
  Mit Zitat antworten Zitat
dGeek
 
#19
  Alt 21. Jul 2016, 16:57
So wie ich das verstanden habe, kann ich also einfach TIniFile durch TMemIniFile austauschen.
Und dort wo gespeichert wird, müsste ich dann UpdateFile aufgerufen werden.

Richtig oder liege ich total falsch?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#20
  Alt 21. Jul 2016, 17:01
Richtig.

Trotz allem würde ich eine Basis-Klasse für die Einstellungen erschaffen und dann konkrete die aus einem bestimmten Topf die Daten beschaffen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 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