Autor Beitrag
dontello
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Mi 09.03.11 16:46 
Hallo,

erstmal ein herzliches Hallo an alle hier im Forum.

Meine erste Frage: Gibt es eine Übersicht über die SQLite Funktionen? (also nicht die unterstützten SQL Befehle)

Zweite Frage:

Ich habe eine SQLite Tabelle erstellt und schreibe einen Datensatz hinein und lese ihn auch wieder aus. Soweit funktioniert das auch.
Wie kann ich jetzt einen zweiten Datensatz einfügen? Irgendwie wird mir immer der erste Datensatz wieder überschrieben.

Anbei mal noch etwas Code:

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:
var
slDBpath: string;
sldb: TSQLiteDatabase;
sltb: TSQLIteTable;
sqlstring: String;

begin

slDBPath := ExtractFilepath(application.exename)
'test.db';

sldb := TSQLiteDatabase.Create(slDBPath);
try

if sldb.TableExists('testtabelle'then begin
sqlstring := 'DROP TABLE testtabelle';
sldb.execsql(sqlstring);
end;

sqlstring := 'CREATE TABLE testtabelle ([ID] INTEGER PRIMARY KEY,';
sqlstring := sqlstring + '[Name] VARCHAR (255),[Ort] VARCHAR (255), [Nummer] INTEGER);';

sldb.execsql(sqlstring);

sldb.BeginTransaction;

name := txt_name.Text;
ort := txt_ort.Text;
nummer := strtoint(txt_nummer.Text);

sqlstring := 'INSERT INTO testtabelle(Name,Ort,Nummer) VALUES ("'+ name +'","' + ort+ '",' + inttostr(nummer)+ ');';
//do the insert
sldb.ExecSQL(sqlstring);

//end the transaction
sldb.Commit;

//query the data
sltb := slDb.GetTable('SELECT * FROM testtabelle');

try

if sltb.Count > 0 then
begin
//display first row

Memo1.Text := 'Name: '+ sltb.FieldAsString(sltb.FieldIndex['Name']) + ' Ort: ' + sltb.FieldAsString(sltb.FieldIndex['Ort']) + ' Nummer: '+ sltb.FieldAsString(sltb.FieldIndex['Nummer']);

end;

finally
sltb.Free;
end;

finally
sldb.Free;

end;

end;


Wie kann ich mehrere Inserts durchführen ohne das der erste Datensatz überschrieben wird?
Und wie kann ich im Select dann alle Datensätze auswählen und anzeigen lassen?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 09.03.11 16:50 
user profile icondontello hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich jetzt einen zweiten Datensatz einfügen? Irgendwie wird mir immer der erste Datensatz wieder überschrieben.
[...]
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if sldb.TableExists('testtabelle'then 
begin
  sqlstring := 'DROP TABLE testtabelle';
  sldb.execsql(sqlstring);
end;

Es ist nicht verwunderlich dass die Daten weg sind, wenn du sie löschst ;)

Wenn du mehrere Inserts machen möchtest, dann kannst du das einfach genau so tun: mehrere Inserts hintereinander schreiben.

Vielleicht hast du da ein Verständnisproblem: Die Tabelle ist nicht weg, wenn du das Programm neu startest. Du musst nicht bei jedem Insert erst die Tabelle erstellen.

//Edit:
wenn ich mich recht erinnere, ist hier ein gutes Beispielprojekt beim Download dabei:
www.itwriting.com/blog/?page_id=659
Vielleicht verwendest du das ja, dann guck mal in dem Ordner ;)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
dontello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Mi 09.03.11 16:58 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Ok du hast Recht. ;)
Das mit dem Drop Table macht Sinn. Habe den Code nur aus einem Beispiel und die Zeile übersehen.
Versuche mich gerade mal ein bisschen mit SQLite zu beschäftigen.

Mit "Select *" müsste ich ja alle Datensätze bekommen. Wie kann ich mir die dann ausgeben lassen?

Und mal noch eine andere Frage. Gibt es eine Möglichkeit die SQLite3.dll direkt mit in die .exe einzubinden oder muss ich die dll immer separat hinzufügen?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 09.03.11 17:05 
user profile icondontello hat folgendes geschrieben Zum zitierten Posting springen:
Mit "Select *" müsste ich ja alle Datensätze bekommen. Wie kann ich mir die dann ausgeben lassen?


Du hast ja oben schon den ersten Eintrag ausgeben. Das musst du nur als Schleife erweitern:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
     Memo1.Text := 'Name: '+ sltb.FieldAsString(sltb.FieldIndex['Name']) + ' Ort: ' + sltb.FieldAsString(sltb.FieldIndex['Ort']) + ' Nummer: '+ sltb.FieldAsString(sltb.FieldIndex['Nummer']);

  while not sltb.EOF do //EOF= End Of File
    begin
     sltb.Next
     Memo1.Lines.Add ( 'Name: '+ sltb.FieldAsString(sltb.FieldIndex['Name']) + ' Ort: ' + sltb.FieldAsString(sltb.FieldIndex['Ort']) + ' Nummer: '+ sltb.FieldAsString(sltb.FieldIndex['Nummer']));
   end;

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
dontello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Mi 09.03.11 17:12 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Funktioniert, Danke. Bekomme dann leider nur noch immer eine Meldung: "Table is at End Of File". ISt das normal oder gibt es auch einen anderen Weg?
vagtler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: Mi 09.03.11 17:20 
Ja, indem Du die Schleife umstellst.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 09.03.11 17:27 
Also ich kriegst selbst nicht hin :lol: Irgendwie war das bei der BDE anders :P

Edit: Quatsch :wall:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 sltb.MoveFirst;
 Memo1.Lines.Clear;

  while not sltb.EOF do //EOF= End Of File
    begin
     Memo1.Lines.Add ( 'Name: '+ sltb.FieldAsString(sltb.FieldIndex['Name']) + ' Ort: ' + sltb.FieldAsString(sltb.FieldIndex['Ort']) + ' Nummer: '
     sltb.Nextsltb.FieldAsString(sltb.FieldIndex['Nummer']));
   end;

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
dontello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Mi 09.03.11 18:20 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

ja funktioniert. Danke.


Kann jemand vielleicht noch was dazu sagen, ob man die dll direkt in die exe einbinden kann oder ob ich die sqlite3.dll immer mitliefern muss?
Tankard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Administrator
Beiträge: 217
Erhaltene Danke: 96



BeitragVerfasst: Mi 09.03.11 18:22 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
while not sltb.EOF do //EOF= End Of File
    begin
      Memo1.Lines.Add ( 'Name: '+ sltb.FieldAsString(sltb.FieldIndex['Name']) + ' Ort: ' + sltb.FieldAsString(sltb.FieldIndex['Ort']) + ' Nummer: '+ sltb.FieldAsString(sltb.FieldIndex['Nummer']));
sltb.Next;    // HIER GEHOERT DAS NEXT HIN !!! 
   end;
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 09.03.11 18:58 
Sehe grad, da hab ich wohl die Formatierung zerlegt...wunder mich warum ich das nicht gesehen hab ^^

Übrigens:
Dontello, du musst nicht immer die ganze Antwort zitieren ;)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
dontello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Mi 09.03.11 20:53 
ja alles klar...diesmal ohne Zitat ;)

Wie sieht es denn mit der sqlite3.dll aus? Muss ich die immer zu der .exe Datei hinzufügen oder kann ich die auch mit in die .exe direkt einfügen? Also das ich nur noch eine Datei habe. Die exe-Datei.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 09.03.11 21:18 
eben mal kurz die Suche benutzt *wink mit dem Zaunpfahl*...

da hab ich z.B. das gefunden:
www.delphi-forum.de/...;highlight=dll+++exe

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Tankard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Administrator
Beiträge: 217
Erhaltene Danke: 96



BeitragVerfasst: Mi 09.03.11 21:56 
hi ja man kann c object files mit einlinken. das ist aber arbeit.

gutes tutorial dazu findest du unter

rvelthuis.de/articles/articles-cobjs.html
dontello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Do 10.03.11 00:03 
gibt es denn sqlite delphi wrapper, die frei zuverwenden sind und ohne dll auskommen?

Oder brauch ich dringend einen externen wrapper? oder kann ich auch diedelphi komponentenverwenden für sqlite? zum beispiel die dbexpress.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 10.03.11 10:11 
Also wenn ich mich nicht total täusche, dann IST die dll das SQLite. Der Wrapper dazu sind die .pas Dateien ;)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
dontello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Do 10.03.11 10:14 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Also wenn ich mich nicht total täusche, dann IST die dll das SQLite. Der Wrapper dazu sind die .pas Dateien ;)


aber wo findet man dann die befehle, die ich verwenden kann?

steh ich da jetz grade etwas auf dem schlauch?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Wie ist es möglich die Datenbankdatei zu überprüfen ob Sie verändert wurde? Es soll quasi verhindert werden, das der User unerlaubt die Datei verändert?
Gibt es eine Möglichkeit die Datenbank-Datei zu crypten. Also das die gespeicherten Daten nicht mit einem anderen Programm, das SQLite unterstützt ausgelesen werden können?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 10.03.11 16:16 
user profile icondontello hat folgendes geschrieben Zum zitierten Posting springen:
aber wo findet man dann die befehle, die ich verwenden kann?

Also SQLite kann so ziemlich die Befehle, die eben SQL ausmachen. Was der Wrapper kann, das kriegst du ja von Delphi angezeigt bzw siehst du auch an einem Beispielprojekt. Du kannst natürlich auch die .pas aufmachen und gucken, was der Wrapper kann.

Weiß nicht genau auf was du hinaus willst

user profile icondontello hat folgendes geschrieben Zum zitierten Posting springen:
Wie ist es möglich die Datenbankdatei zu überprüfen ob Sie verändert wurde? Es soll quasi verhindert werden, das der User unerlaubt die Datei verändert?
Gibt es eine Möglichkeit die Datenbank-Datei zu crypten. Also das die gespeicherten Daten nicht mit einem anderen Programm, das SQLite unterstützt ausgelesen werden können?

Naja. Also verschlüsseln tut man normal nicht die Datenbankdatei, sondern den Inhalt. Im Endeffekt ist es so, wenn die Datei bei mir im Ordner liegt, dann lösch ich sie und weg ist sie. Da will ich mal sehen was dein Programm macht ;) Ob es bei SQLite auch die Möglichkeit gibt, die Datei zu per Passwort zu sichern weiß ich nicht. Aber wie sicher das dann ist :nixweiss: Richtig wichtige Daten liegen normal irgendwo auf nem Server, wo keiner ran kann (außer über die freigegebenen Schnittstellen)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
dontello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Fr 11.03.11 12:06 
Also so weit so gut bin ich jetzt vorangekommen.

Allerdings habe ich momentan ein Speicher Problem. Ich führe erst einen INSERT aus und möchte danach einen SELECT * machen.
Der INSERT funktioniert, doch beim SELECT bekomme ich eine Zugriffsverletzung.

Auf der sqlite Webseite habe ich gelesen, das man den Speicher wieder mit sqlite3_malloc freigeben kann. Jedoch finde ich dies Funktion bei mir nicht.
Mit sqlite3_free() hatte ich auch keinen Erfolg.

Wie kann ich mein Problem lösen? Hat jemand einen Ansatz?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Fr 11.03.11 12:09 
So aus der hohlen Hand kann ich da nix sagen. Zeig mal deinen Code dazu. Es ist relativ unwahrscheinlich dass die Datenbank die AV auslöst ;) Im schlechtesten Fall ist es der Wrapper. Aber ich vermute eher, es liegt an deinem Code.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
dontello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2



BeitragVerfasst: Fr 11.03.11 12:13 
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:
procedure TForm4.btn_insertClick(Sender: TObject);
var
db : TSQLiteDB;
dbback : TSQLiteExecCallback;
sqlstring: PAnsiChar;
udata: Pointer;
error: PAnsiChar;
name: string;
ort: string;

begin

  if sqlite3.SQLite3_Open('C:\temp\teschtlitedb.bcdb',db) = 0 then
  begin

    sqlstring := 'CREATE TABLE IF NOT EXISTS tescht ([id] INTEGER PRIMARY KEY, [name] VARCHAR (255), [ort] VARCHAR (255))';

      if sqlite3.SQLite3_Exec(db,sqlstring,dbback,udata,error) = 0 then
      begin

        name := txt_name.Text;
        ort := txt_ort.Text;

        sqlstring := PChar('INSERT INTO tescht (name, ort)VALUES("'+ name + '", "' + ort + '")');

          if sqlite3.SQLite3_Exec(db,sqlstring,dbback,udata,error) = 0 then
          begin

            Memo1.Text := EmptyStr;
            Memo1.Text := 'Daten aktualisiert';
            sqlite3.sqlite3_close(db);
          end
          else
          begin
            Memo1.Text := sqlite3.sqlite3_errmsg(db);
          end;
      end
      else
      begin
        Memo1.Text := sqlite3.sqlite3_errmsg(db);
      end;
  end
  else
  begin
    Memo1.Text := sqlite3.sqlite3_errmsg(db);
  end;



end;


procedure TForm4.btn_selectClick(Sender: TObject);
var
db : TSQLiteDB;
dbback : TSQLiteExecCallback;
sqlstring: PAnsiChar;
udata: Pointer;
error: PAnsiChar;
result: TSQLiteResult;
row: Cardinal;
col: Cardinal;

begin

  if sqlite3.SQLite3_Open('C:\temp\teschtlitedb.bcdb',db) = 0 then
  begin
    sqlstring := PChar('SELECT name, ort FROM tescht');

      if sqlite3.SQLite3_Exec(db,sqlstring,dbback,udata,error) = 0 then
      begin

        Memo1.Text := inttostr(sqlite3.sqlite3_gettable(db,sqlstring,result,row,col,error));

      end
      else
      begin
         Memo1.Text := sqlite3.sqlite3_errmsg(db);
      end;
  end;


end;



Das ganze ist nur zum probieren und verstehen für mich. :)

Moderiert von user profile iconKlabautermann: Code- zu Delphi-Tags geändert