Autor |
Beitrag |
Grafix
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: So 10.05.09 23:38
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?
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.05.09 23:55
Die DLL alleine bringt dir ja in Delphi nichts, du musst diese ja auch in deinem Delphiprojekt benutzen. Dafür kannst du z.B. dies benutzen:
prdownloads.sourcefo....4_full.zip?download
(Projekt: sqlite4delphi.sourceforge.net/)
Die BDE ist veraltet, das stimmt, die wird seit 8 Jahren nicht mehr weiterentwickelt. Insbesondere muss die aber im Gegensatz zu SQLite installiert werden damit das Programm funktioniert, bei SQLite reicht die DLL neben der Exe.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: 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
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
|
|
Regan
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Mo 11.05.09 14:30
Bei diesem Link findest du ein sehr gutes Beispiel.
Moderiert von Tino: Link korrigiert.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mo 11.05.09 15:45
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: 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.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mo 11.05.09 19:17
Grafix hat folgendes geschrieben : | dumme Frage: was ist ein Wrapper?? |
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:
sqlite.org/sqlitedll-3_6_14.zip
www.itwriting.com/re...litesimpledelphi.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
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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?
Weil bei allen anderen DLLs ist das ja nicht notwendig.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mo 11.05.09 20:28
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: 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.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: 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
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: 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
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
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: 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  .
|
|
|