Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   TSQLiteDatabase: A SQLite3 Database Wrapper (https://www.delphipraxis.net/140402-tsqlitedatabase-sqlite3-database-wrapper.html)

HalloDu 17. Sep 2009 16:42


TSQLiteDatabase: A SQLite3 Database Wrapper
 
Liste der Anhänge anzeigen (Anzahl: 1)
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
:arrow: Verbinden mit einer SQLite3 kompatiblen Datenbank
:arrow: Ausführen von SQL-Statments
:arrow: Bindings in den Statments
:arrow: Erzeugen von Collations, Aggregaten und Funktionen
:arrow: Fortschrittsereignis bei längeren Prozessen
:arrow: Autorisieren von bestimmten SQL-Aktionen
:arrow: Blob-Zugriff als Stream
:arrow: Weiterarbeiten mit SQLite-internen Werten
:arrow: Limits setzen
:arrow: In Delphi 2009: Unicode
:arrow: 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...
:arrow: Delphi 2009 größtenteils, da ich es im Moment in einem Projekt einsetze
:arrow: 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

xZise 17. Sep 2009 19:05

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
Moin,
also es gibt ja den "Simple SQLite Wrapper for Delphi". Und was mich da stört ist, dass Objekte zurückgegeben werden. Stattdessen (finde ich), sollten Objekte immer übergeben werden:
Delphi-Quellcode:
type
  TA = class;
  TB = class
  public
    procedure Query(A : TA);
  end;

var
  A : TA;
  B : TB;
begin
  A := TA.Create;
  B := TB.Create;
  try
    TB.Query(A);
  finally
    A.Free;
    B.Free;
  end;
end.
Außerdem vermisse ich das man nachträglich eine/die Datenbank lädt. Zum Beispiel, wenn man die Klasse in einer Klasse kapselt und man erst nachträglich die Datenbank laden will, aber die Klasse halt vorher erstellt, dann ist das immer relativ unschön.

Und was ich auch noch implementieren musste ist eine Möglichkeit Werte zu verschlüsseln und zu entschlüsseln. Übrigens (ich habe es mir nicht angeguckt ehrlich gesagt) wie gehst du mit Strings um? Weil der Simple Wrapper der speichert das als "Binary" sozusagen als Input, statt UTF8/UTF16 zu nehmen (also Input in UTF8 umwandeln und dann UTF8 rausholen und in Ansi-/Unicodestring beim auslesen umwandeln.

Und wie verhält es sich mit verschiedenen Datentypen pro Zelle? Weil in der Dokumentation steht so weit ich weiß, dass die Werte pro Zelle selbst innerhalb einer Spalte verschiedenen sein können/dürfen.

Und auch eine ganz wichtige Frage: Und zwar sind bei dir alle Aufrufe mit UTF8/UTF16? Weil die andere Implementation übergibt einen AnsiString statt einen UTF8String :D Das macht natürlich Probleme mit dem Auslesen.

MfG
xZise

HalloDu 17. Sep 2009 19:11

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
Naja, wer möchte kann sich seine TSQLiteQuery und TSQLiteCommand auch selbst instanzieren.

Ja, die Sache mit dem AnsiString ist tatsächlich noch zu überarbeiten, hatte aber im Moment nicht absolute Priorität, da ich in Delphi 2009 damit keine Probleme hatte.

Ganz abgesehen davon, das die ganze Geschichte auch keine schlechte Übung war und zu viel Verständnis für SQLite geführt hat.

xZise 17. Sep 2009 19:15

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
Zitat:

Zitat von HalloDu
Naja, wer möchte kann sich seine TSQLiteQuery und TSQLiteCommand auch selbst instanzieren.[...]

Und dann? Du sagst doch "Result := <Klasse>.Create(...)" in "TSQLiteDatabase.Command". Und tada ein Speicherleck ;)

Ich sage natürlich nicht das deine Arbeit schlecht war ^^ aber genau diese Dinge habe im Simple SQLite Wrapper vermisst ;) Und ich finde eigentlich gehört sich sowas wie in TSQLiteDatabase.Command nicht, aber das ist natürlich Geschmackssache.

Und ich bin eigentlich daran in gewisser weise interessiert.

MfG
xZise

HalloDu 17. Sep 2009 19:45

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
Mal sehen, ob ich am Wochende dazu komme das umzusetzen. Im Übrigen ist Kritik natürlich immer erwünscht. Die macht das Endprodukt ja nur besser.

Elvis 17. Sep 2009 21:58

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
Würdest du in den Factories (DB.Create, ...) Interfaces zurückgeben, gäbe es gar kein Problem.
Die werden durch Referenzzählung autom. freigeben. Dadurch sieht der Code nicht so grausam aus mit all den verschachtelten try-finally-Blöcken, die Delphi sonst so braucht. (kotz!)

Deine normalen Klassen (Command etc) würden diese Interfaces implementieren und alles wäre in Butter.

Mithrandir 29. Sep 2009 15:14

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
Sowas habe ich gesucht, super! :thumb:

*gleich mal testen*

Nachtrag: Hmm... Wäre eigentlich ganz praktisch, wenn mir die Klasse n Feedback geben würde, ob die DB-Datei schon existiert oder nicht

Mithrandir 2. Okt 2009 08:44

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
:thumb:

Das Dingens gefällt mir mittlerweile richtig gut, die Bedienung ist simpel und einfach, und dank nonVCL-Fähigkeiten auch für solche Programme geeignet. Dennoch ist mir die Geschwindigkeit negativ aufgefallen. Folgendes Konstrukt:

Delphi-Quellcode:
  procedure TDatabase.AddFile(FileSpecs: TFileSpecs);
  var
    FileCmd: TSQLiteCommand;
  begin
    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;
  end;
~100 Einträge hinzuzufügen dauert fast 10 Sekunden, imho zu langsam. Ich habe schon, wie von Zeos gewohnt, das Erstellen das Objekts "FileCmd" ausgelagert, und nur noch den Teil mit "FileCmd.Binding[n].AsXYZ" sowie den Execute-Teil drin gelassen. Dann rennt er da zwar durch, aber fügt auch nichts zur DB hinzu. Mache ich irgendwas falsch?

HalloDu 6. Okt 2009 20:42

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
Ich muss mich der ganzen Kiste mal über nächstes Wochenende annehmen. Im Moment habe ich leider keine Zeit mich mit dem Problem näher zu beschäftigen. Es freut mich aber das es dir gefällt.

PS: Auch die Sache mit den Interfaces werde ich mir dann mal ansehen.

Mithrandir 6. Okt 2009 20:49

Re: TSQLiteDatabase: A SQLite3 Database Wrapper
 
Ok, cool. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.
Seite 1 von 3  1 23      

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