Autor Beitrag
Grafix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Mo 11.05.09 14:30 
Bei diesem Link findest du ein sehr gutes Beispiel.

Moderiert von user profile iconTino: Link korrigiert.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mo 11.05.09 15:45 
user profile iconRegan hat folgendes geschrieben Zum zitierten Posting springen:
Bei diesem Link findest du ein sehr gutes Beispiel.


Das ist ein exzellenter Wrapper den ich auch in meinen Projekten verwende. Kleines Beispiel:
ausblenden 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']));  //gibt den Wert von Spalte1 aus
      //....
      table.Next;
    end;
  end;
  table.Free;
  db.Free;
end;
Grafix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mo 11.05.09 19:17 
user profile iconGrafix hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconGrafix hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 11.05.09 20:15 
user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
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.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mo 11.05.09 20:28 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
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.


Keine Ahnung warum das so ist. Konnte jedenfalls kein Projekt welches SQLite verwendet mehr aus der IDE starten. Ist schon eine Zeit lang her, glaube die Fehlermeldung besagte das sqlite3.dll nicht gefunden werden konnte. Vielleicht verbiegt der Debugger ja das Arbeitsverzeichnis?
Grafix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: Mo 11.05.09 22:35 
hehe soweit funktioniert das schonmal, danke!
Wie ist das jetzt mit der Database, mit

ausblenden Delphi-Quelltext
1:
db := TSQLiteDatabase.Create(DBPath);					


erstelle ich diese ja. Aber wie wirkt sich dies aus? Wir die Datenbank als Datei gespeichert? Mit

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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 Suche in der Entwickler-Ecke 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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

ausblenden volle Höhe 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
    { Public declarations }
  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//Zählvariable für Panelidentifikation
    SLSpeicher_Nachname := TStringList.Create;
    SLSpeicher_Vorname  := TStringList.Create;

    while not tb.EOF do
    begin
      //Panel erzeugen
      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); //Höhe des nächsten Panels um x erhöhen
      tb.Next;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  anzeigen;
  PanelXClick(TPanel(Sender)); //Ersten Eintrag aufrufen
  LAnzahl.Caption := IntToStr(tb.RowCount); //Anzahl der Einträge ausgeben
end;

end.
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: 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:

  1. Am Anfang des Programms oder vor einem Query eine gültige Datenbankverbindung aufgebaut hast und
  2. Ob die Tabelle (richtiger Tabellenname wäre angebracht) wirklich existiert

Dann kannst du nochmal wiederkommen ;) .