Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi XE6 und SQLite (https://www.delphipraxis.net/183780-delphi-xe6-und-sqlite.html)

schand99 4. Feb 2015 08:55

Datenbank: SQLite • Version: 3 • Zugriff über: TSQLConnection

Delphi XE6 und SQLite
 
Hallo,

bin noch ziemlich neu in Delphi und habe noch einige Schwierigkeiten mit Sachen die vielleicht für andere ganz einfach erscheinen. Zur Zeit versuche ich eine SQLite Datenbank zu erstellen (klappt), Daten einzutragen (klappt) und die Daten auszulesen (klappt nicht). In einem anderen Delphi-Forum habe ich ein kleines Tutorial über den Umgang mit SQLite gefunden. Das Tutorial ist für XE3, da nicht alles funktioniert wie beschrieben vermute ich dass es da doch ein paar kleine Unterschiede zwischen XE3 und XE6 gibt. Die vielen Versionen der Entwicklungsumgebung sind generell ein kleines Problem. Embarcadero wirft meiner Meinung nach viel zu oft neue Versionen auf den Markt.
Natürlich benutze ich auch die Delphi-Hilfe und Google in der Hoffnung irgendwo auf einen nützlichen Hinweis zu finden..

Hier ein kurzer Quellcode der mir nun schon ein paar Tage Kopfzerbrechen bereitet:

Delphi-Quellcode:
 Var
 SQLBefehl, Rg:String;
 DatenSatz:TDataSet;
 N: Integer;
begin
 Try
   SQLConnection.Connected:=False;
   SQLConnection.Params.Values['Database']:='C:\CD-Copy\SQLite.db';
   SQLCOnnection.Params.Values['FailIfMissing']:='False';
   SQLConnection.Connected:=True;
   SQLBefehl:='CREATE TABLE Fahrzeuge (MeinID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Marke VARCHAR(100), Modell VARCHAR(100));';
   SQLConnection.ExecuteDirect(SQLBefehl);
   SQLBefehl:='INSERT INTO Fahrzeuge (MeinID, Marke, Modell) VALUES (NULL, "Fiat", "Punto");';
   SQLConnection.ExecuteDirect(SQLBefehl);
   SQLBefehl:='SELECT * FROM Fahrzeuge;';
   SQLConnection.Execute(SQLBefehl,NIL, DatenSatz);
   DatenSatz.First;
   while NOT Datensatz.Bof do
   Begin
     Rg:='';
     for N := 0 to DatenSatz.FieldCount-1 do
       Rg:=Rg+' '+DatenSatz.Fields[N].AsString;
     ShowMessage(Rg);
     DatenSatz.Next;
   End;
 Except
   On E: EDataBaseError Do Showmessage(E.Message);
 End;
Läuft übrigens fehlerfrei durch, nur dass keine Daten aus der Datenbank gelesen werden stört ungeheuerlich ;-)

Bin für alle Tipps welche mir helfen könnten eine Messagebox mit Inhalten aus der Datenbank zu erzeugen dankbar :wink:

Klaus01 4. Feb 2015 09:02

AW: Delphi XE6 und SQLite
 
.. sollte das nicht eof heißen?

Delphi-Quellcode:
 while NOT Datensatz.eof{Bof} do
   Begin
     Rg:='';
     for N := 0 to DatenSatz.FieldCount-1 do
       Rg:=Rg+' '+DatenSatz.Fields[N].AsString;
     ShowMessage(Rg);
     DatenSatz.Next;
   End;
oder
Delphi-Quellcode:
   repeat
     Rg:='';
     for N := 0 to DatenSatz.FieldCount-1 do
       Rg:=Rg+' '+DatenSatz.Fields[N].AsString;
     ShowMessage(Rg);
     DatenSatz.Next;
   until Datensatz.eof
Grüße
Klaus

Sir Rufo 4. Feb 2015 09:15

AW: Delphi XE6 und SQLite
 
Und wie schon erwähnt, kannst du das
Delphi-Quellcode:
try except
ersatzlos streichen.

Wenn eine Exception auftritt wird von ganz alleine (macht
Delphi-Quellcode:
TApplication
) eine MessageBox mit der Exception angezeigt. Weniger machen und mehr bekommen.

schand99 4. Feb 2015 09:56

AW: Delphi XE6 und SQLite
 
Der erste Tipp hat mich über einen Umweg auf die Lösung für das Problem gebracht.
Im Unterschied zu dem uralten VB6 steht der Datensatzzeiger in Delphi Anwendungen auch bei SQL Abfragen welche Daten enthalten erstmal immer auf BOF, in VB6 jedoch auf dem ersten Datensatz welcher Daten enthält
Wie gewohnt habe ich zur Überprüfung ob Daten vorhanden sind abgefragt ob BOF = True ist. Funktioniert in Delphi nicht so wie erwartet. Nun frage ich EOF ab und alles läuft. Wenn eine SQL Abfrage keine Datensätze liefert dann sind ja BOF und EOF True.

Die Try .. except finde ich hilfreich. Was mache ich da falsch?

Wie bereits gesagt bin ich in der Delphi Umgebung noch blutiger Anfänger...

schand99 4. Feb 2015 10:11

AW: Delphi XE6 und SQLite
 
Zitat:

Zitat von Sir Rufo (Beitrag 1288785)
Und wie schon erwähnt, kannst du das
Delphi-Quellcode:
try except
ersatzlos streichen.

Wenn eine Exception auftritt wird von ganz alleine (macht
Delphi-Quellcode:
TApplication
) eine MessageBox mit der Exception angezeigt. Weniger machen und mehr bekommen.

Glaube nicht dass dies auch für Android-Geräte zutrifft. Ohne Try.. Except schmiert die App kommentarlos ab.

Sir Rufo 4. Feb 2015 10:44

AW: Delphi XE6 und SQLite
 
Zitat:

Zitat von schand99 (Beitrag 1288792)
Zitat:

Zitat von Sir Rufo (Beitrag 1288785)
Und wie schon erwähnt, kannst du das
Delphi-Quellcode:
try except
ersatzlos streichen.

Wenn eine Exception auftritt wird von ganz alleine (macht
Delphi-Quellcode:
TApplication
) eine MessageBox mit der Exception angezeigt. Weniger machen und mehr bekommen.

Glaube nicht dass dies auch für Android-Geräte zutrifft. Ohne Try.. Except schmiert die App kommentarlos ab.

Generell bei jeder nicht gefangenen Exception?

Kann ich mit XE7 so nicht nachvollziehen und wäre dann ein Bug in XE6. Aber der richtige Ort um dort helfend einzugreifen ist
Delphi-Quellcode:
TApplication.OnException
. Dort kannst du deine ungefangenen Exceptions behandeln wie du möchtest.
Anzeigen, Loggen, ...

Dejan Vu 5. Feb 2015 06:24

AW: Delphi XE6 und SQLite
 
Ein Try-Except-Skelett sehe ich auch immer wieder. Es schadet nichts und sagt aus, SOLANGE DER EXCEPT-TEIL NICHT LEER IST. Er besagt ja, das man eine Fehlerbehandlung noch einbauen möchte. Hier wäre ein TODO allerdings angebracht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz