![]() |
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:
Ein "INSERT" mit Binding
var DB: TSQLiteDatabase;
begin DB := TSQLiteDatabase.Create('test.db'); DB.Execute('INSERT INTO TEST (TEST) VALUES ("TEST");'); DB.Free; end;
Delphi-Quellcode:
Auflisten der Daten einer Tabelle
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.
Delphi-Quellcode:
Beispiel mit vielen "INSERT"s
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.
Delphi-Quellcode:
Getestet mit...
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. :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 |
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:
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.
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. 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 |
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. |
Re: TSQLiteDatabase: A SQLite3 Database Wrapper
Zitat:
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 |
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.
|
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. |
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 |
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:
~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?
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; |
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. |
Re: TSQLiteDatabase: A SQLite3 Database Wrapper
Ok, cool. :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz