Entwickler-Ecke
Datenbanken - SQLlite
Grafix - So 10.05.09 23:38
Titel: SQLlite
n'Abend,
hab gerade erfahren, dass BDE (so wie wirs gerade in der Schule lernen) verlatet ist -.- also möchte ich mit meinem Programm gerne auf SQLlite umsteigen, da man dafür je keinen Server installieren muss. Ich habe mir auch die Datei sqllite3.dll runtergeladen und ins Verzeichnis wo sich auch mein Projekt befindet gespeichert.
Über var db: TSQLiteDatabase;
table: TSQLIteTable;
habe ich versucht die DB zu deklarieren. Aber er erkennts nicht. Muss ich im uses-Teil noch zusätzlich etwas deklarieren?
alzaimar - Mo 11.05.09 08:04
Vielleicht sollte man noch andere DB ins Spiel bringen, denn SQLite ist zwar klein und fein, aber eben nicht für größere Aufgaben gedacht und eigentlich eher ein Single-User DBMS. Bei SQLite fehlen z.B. integrale Funktionen, die ein richtiges RDBMS erst so mächtig machen.
Du könntest dich auch mit Firebird (embedded) beschäftigen und dann ggf auf einen 'richtigen' Server umsteigen.
Grafix - Mo 11.05.09 13:49
aber wenn ich das richtig verstehe, dann muss ich ja (wenn ich hier ein DB System nutze, dass einen installierten Server benötigt) irgendwie beim Clienten den Server auch installieren (also der, der mein Programm am ende benutzt). Das ist ja total umständlich oder?
edit: Ich habe mir das Archiv über deinen Link gedwownloaded, aber ich weiß nicht, wie ich es installiere, ich habs einfach in mein delphi-Verzeichnis entpackt und in die entsprechenden Ordner integriert. Aber ich bekomm die Fehlermeldungen, dass die *.dcu Dateien nicht gefunden wurden:
SLEngine,
SLDB,
SLDataSet,
SLFunAgr;
... hat jemand eine idee?
jaenicke - Mo 11.05.09 14:19
Bei Firebord embedded ist das nicht nötig, es wäre aber einfacher möglich auf eine nicht embedded Firebird Datenbank zuzugreifen. SQLite kann nur embedded arbeiten.
Andreas L. - Mo 11.05.09 15:45
Das ist ein exzellenter Wrapper den ich auch in meinen Projekten verwende. Kleines Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var db: TSQLiteDatabase; table: TSQLIteTable; begin db := TSQLiteDatabase.Create('C:\DB.sqlite'); if table.Exists('tabellenname') then begin table := db.GetTable('SELECT spalte1, spalte2 FROM tabellenname'); while not table.EOF do begin ShowMessage(table.FieldAsString(table.FieldIndex['spalte1'])); table.Next; end; end; table.Free; db.Free; end; |
Grafix - Mo 11.05.09 18:52
dumme Frage: was ist ein Wrapper??
Ich komm mit SQLite nicht zurrecht, nochmal für Dumme: ich hab mir das Tool sqlitedll-3_6_11 gedownloaded. Wo soll ich dessen Inhalt jetzt hinkopieren? Und wie kann ich dass dann einbinden? Und welche Datei muss ich dem Clienten später mitgeben?
Andreas L. - Mo 11.05.09 19:17
Grafix hat folgendes geschrieben : |
dumme Frage: was ist ein Wrapper?? |
http://de.wikipedia.org/wiki/Wrapper_(Software)
In diesem Fall ist es quasi eine Schnittstelle zur Kommunikation zwischen der Delphi-Anwendung und der DLL.
Grafix hat folgendes geschrieben : |
Ich komm mit SQLite nicht zurrecht, nochmal für Dumme: ich hab mir das Tool sqlitedll-3_6_11 gedownloaded. Wo soll ich dessen Inhalt jetzt hinkopieren? Und wie kann ich dass dann einbinden? Und welche Datei muss ich dem Clienten später mitgeben? |
Du brauchst die folgenden Sachen:
http://sqlite.org/sqlitedll-3_6_14.zip
http://www.itwriting.com/repos/sqlitewrapper/trunk/sqlitesimpledelphi.zip
In sqlitedll-3_6_14.zip ist die sqlite3.dll enthalten. Die muss 1. ins selbe Verzeichnis wie deine Exe und später mit weitergegeben werden, 2. musst du die Datei im bin-Verzeichnis deiner Delphi-Installation platzieren damit du eine Anwendung die SQLite verwendet auch debuggen kannst.
Die in sqlitesimpledelphi.zip enthaltenen Dateien SQLite3.pas, sqlite3udf.pas und SqLite3Table.pas kopierst du entweder in ein Verzeichnis das von Delphi durchsucht wird (Tools > Optionen > Bibliothek > Bibliothekspfad (unter Turbo Delphi 2006)) oder der Einfachheit wegen ins Lib-Verzeichnis deiner Delphi-Installation. Dann musst du nur noch die Uses-Klausel deiner Unit erweitern:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| unit Unit1;
interface
uses ..., SQLiteTable3;
... |
Hast du alles richtig gemacht sollte sich mein Beispiel kompilieren lassen.
jaenicke - Mo 11.05.09 20:15
Andreas L. hat folgendes geschrieben : |
2. musst du die Datei im bin-Verzeichnis deiner Delphi-Installation platzieren damit du eine Anwendung die SQLite verwendet auch debuggen kannst. |
Was ist denn da bei SQLite so besonderes, dass das da notwendig ist? :shock:
Weil bei allen anderen DLLs ist das ja nicht notwendig.
Grafix - Mo 11.05.09 22:35
hehe soweit funktioniert das schonmal, danke!
Wie ist das jetzt mit der Database, mit
Delphi-Quelltext
1:
| db := TSQLiteDatabase.Create(DBPath); |
erstelle ich diese ja. Aber wie wirkt sich dies aus? Wir die Datenbank als Datei gespeichert? Mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| if db.TableExists('adressen.db') then anzeigen else begin SQL := 'CREATE TABLE adressen ([ID] INTEGER PRIMARY KEY,'; SQL := SQL + '[Vorname] VARCHAR (40), [Nachname] VARCHAR (40),'; SQL := SQL + '[Strasse] VARCHAR (40), [Hausnummer] VARCHAR (4),'; SQL := SQL + '[Ort] VARCHAR (40), [PLZ] VARCHAR (5),'; SQL := SQL + '[Telefon] VARCHAR (20), [Handy] VARCHAR (20),'; SQL := SQL + '[Email] VARCHAR (40), [Kommentar] TEXT,'; SQL := SQL + '[Nick] VARCHAR (20), [Geburtstag] DATE,'; SQL := SQL + '[Website] VARCHAR (100));';
db.ExecSQL(SQL); end; |
erstelle ich drauf die Tabelle... ist dass nun meine Datei?! Die Sache ist nun die, dass er mir überhaupt keine Datenbank Datei erstellt -.- Was mach ich falsch?
Andreas L. - Di 12.05.09 10:56
Wenn in DBPath der selbe Pfad wie in
db.TableExists('adressen.db') wird das Problem wohl der relative Pfad sein. Verwende immer absolute Pfade. Z. B. ExtractFilePath(Application.exeName) + 'Datei.dat' für das Programmverzeichnis wobei das auch nicht der richtige Speicherort ist wenn die App auch unter Win2k, XP, Vista, 7 laufen sollen. Siehe
GETSHELLFOLDER. Falls sich der Fehler dadurch nicht beheben lässt zeig mal bitte etwas mehr Code.
EDIT: Ich glaub deine SQL-Syntax ist falsch, probiers mal so:
SQL-Anweisung
1:
| CREATE TABLE adressen (ID INTEGER, Vorname VARCHAR(40), Nachname VARCHAR(40), Strasse VARCHAR(40), Hausnummer VARCHAR(4), Ort VARCHAR(40), PLZ VARCHAR(5), Telefon VARCHAR(20), Handy VARCHAR(20), Email VARCHAR (40), Kommentar TEXT, Nick VARCHAR(20), Geburtstag DATE, Website VARCHAR(100), PRIMARY KEY(ID)) |
Änderungen: Keine Eckklammern der Bezeichner, keine Abstände zwischen Datentyp und Mengenbegrenzung, PRIMARY KEY wird erst am Schluss definiert.
Außerdem solltest du dir Gedanken machen ob es eine gute Idee ist die PLZ als Varchar zu definieren und die E-Mail-Adresse auf 40 Zeichen zu begrenzen.
ub60 - Di 12.05.09 16:22
@Grafix:
Ich würde die VARCHAR durch CHAR ersetzen. Dann sind alle Datensätze gleich lang und der Zugriff geht schneller.
@Andreas L.:
Was würdest Du denn für die PLZ nehmen? INT scheidet wegen der möglichen führenden 0 (Raum Sachsen oder so) aus.
ub60
Grafix - Do 14.05.09 17:12
Also hier mal mein ganzer Code, habe das Problem nicht beheben können. Beim Starten kommen zwei fehlermeldungen:
1. Could not prepare SQL-Statement
2. TAdressen: Operation bei geschlossener Datenmenge nicht ausführbar
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, Mask, DBCtrls, Grids, DBGrids, XPMan, ExtCtrls, ShellAPI, DBTables, SQLiteTable3;
type TForm1 = class(TForm) BHinzufuegen: TButton; BSchliessen: TButton; LAnzahl: TLabel; Label1: TLabel; BSuche: TButton; ESuche: TEdit; SBInhalt: TScrollBox; XPManifest1: TXPManifest; Label2: TLabel; GBDetails: TGroupBox; LName_Top: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; LGanzer_Name: TLabel; LStrasse: TLabel; LOrt: TLabel; Label6: TLabel; LHandy: TLabel; Label7: TLabel; LEmail: TLabel; Label8: TLabel; LGeburtstag: TLabel; Label9: TLabel; LWebsite: TLabel; Label10: TLabel; Bevel1: TBevel; MKommentar: TMemo; Label11: TLabel; LICQ: TLabel; procedure BHinzufuegenClick(Sender: TObject); procedure BSchliessenClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ESucheClick(Sender: TObject); procedure PanelXClick(Sender:TObject); procedure LEmailClick(Sender: TObject); procedure LWebsiteClick(Sender: TObject); procedure BSucheClick(Sender: TObject); procedure erstelle_tabelle; procedure anzeigen; procedure loeschen; private SLSpeicher_Nachname: TStringList; SLSPeicher_Vorname : TStringList; db: TSQLiteDatabase; tb: TSQLIteTable; public end;
var Form1: TForm1;
implementation
uses Uadd;
{$R *.dfm}
procedure TForm1.erstelle_tabelle; var DBpath: string; db: TSQLiteDatabase; SQL: string; begin DBPath := ExtractFilepath(application.exename) + 'adressen.db'; db := TSQLiteDatabase.Create(DBPath);
if db.TableExists('adressen.db') then anzeigen else begin SQL := 'CREATE TABLE adressen (ID INTEGER, Vorname VARCHAR(40), Nachname VARCHAR(40), Strasse VARCHAR(40), Hausnummer VARCHAR(4), Ort VARCHAR(40), PLZ VARCHAR(5), Telefon VARCHAR(20), Handy VARCHAR(20), Email VARCHAR (40), Kommentar TEXT, Nick VARCHAR(20), Geburtstag DATE, Website VARCHAR(100), PRIMARY KEY(ID))';
db.ExecSQL(SQL); end; end;
procedure TForm1.anzeigen; var Name: TLabel; Panel: TPanel; top, i: Integer; begin if db.TableExists('adressen.db') then begin tb := Db.GetTable('SELECT * FROM adressen');
top := 5; i := 0; SLSpeicher_Nachname := TStringList.Create; SLSpeicher_Vorname := TStringList.Create;
while not tb.EOF do begin Panel := TPanel.Create(self); Panel.Parent := SBInhalt; Panel.Top := top; Panel.Left := 5; Panel.Tag := i; Panel.OnClick := PanelXClick;
Name := TLabel.Create(self); Name.Parent := Panel; Name.Top := 10; Name.Left := 5; Name.Height := 26; Name.AutoSize := False; Name.Align := alBottom; Name.Alignment := taCenter; Name.Tag := i; Name.OnClick := PanelXClick; Name.Caption := tb.FieldAsString(tb.FieldIndex['Vorname']) + (' ') + tb.FieldAsString(tb.FieldIndex['Nachname']);
SLSpeicher_Nachname.Insert(i, tb.FieldAsString(tb.FieldIndex['Nachname'])); SLSpeicher_Vorname.Insert(i, tb.FieldAsString(tb.FieldIndex['Vorname']));
i := i + 1; inc(top, 50); tb.Next; end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin anzeigen; PanelXClick(TPanel(Sender)); LAnzahl.Caption := IntToStr(tb.RowCount); end;
end. |
Regan - Do 14.05.09 17:59
Irgendwie scheinst du mir noch nicht zu wissen, was du überhaupt machst bzw., wie eine Datenbank aufgebaut ist:
Eine Datenbank besteht aus Tabellen, d.h. wenn du auf
TableExists prüfst, dann musst du auch einen Tabellen Namen angeben. Des Weiteren musst du bei jedem Zugriff auf die Datenbank, auch einen Zugriff auf die Datenbank haben. Deshalb solltest du deinen Code dahingehend überprüfen, ob du:
- Am Anfang des Programms oder vor einem Query eine gültige Datenbankverbindung aufgebaut hast und
- Ob die Tabelle (richtiger Tabellenname wäre angebracht) wirklich existiert
Dann kannst du nochmal wiederkommen ;) .
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!