Delphi-PRAXiS
Seite 7 von 8   « Erste     567 8      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ID nicht gefunden nach last_insert_rowid() (https://www.delphipraxis.net/192717-id-nicht-gefunden-nach-last_insert_rowid.html)

EdAdvokat 16. Mai 2017 16:35

AW: ID nicht gefunden nach last_insert_rowid()
 
Liste der Anhänge anzeigen (Anzahl: 1)
anbei das Programm mit der jungfräulichen Datenbank und der Tabelle KONTAKTE mit nur einem Datensatz.(bitte ggf. diese Datei sichern vor erster Probe)
Eigentlich war ich mit der funktionierenden Lösung ganz glücklich, sofern es kein Fehler wäre diese zu verwenden. Ich betone nochmals, ich will anhand dieses Programms lernen und möglichst nichts falsches lernen. Hoffentlich ist das was ich da geschrieben habe wirklich dafür geeignet. Leider muss ich mir das alles so zusammenklauben, denn so wirkliche Beispiele, anhand der ich prüfen könnte, ob ich richtig liege gibt es wohl nicht. Da bin ich daher sehr sehr dankbar, dass es hier im Forum Hilfe und Unterstützung gab und gibt. Ich habe ein Edit für die Eingabe von SQL-Statements an die bewußte Stelle eingefügt. Somit kann unabhängig von welcher Delphiversion auch immer das Problem nachvollzogen werden.
Wenn beim Überfliegen des Prg. noch andere Ecken und Kanten auffallen, wäre ich für Hinweise dankbar und bereite mich schon auf einiges vor....
Bitte berücksichtigt, dass ich noch lerne und leider wenig wirklich geeignete Tutorials zu dem Thema gefunden habe.
Nochmals ich habe nur auf die fortgeschriebene Diskussion geantwortet und die darin genannten Lösungsansätze probiert. Wenn es mit der funktionierenden Lösung ok ist, dann soll es so sein.
Danke

haentschman 16. Mai 2017 17:15

AW: ID nicht gefunden nach last_insert_rowid()
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöle...:P
Ach Jungs...soviele Beiträge und ein Blick in die Dataset DefList hätte genügt. :P

@EdAdvokat:
Der der Debugger hilft dir solche Probleme zu analysieren. :thumb:

Ich weiß das das nur zum Testen ist...aber die Logik dahinter verstehe icht nicht. :?
Delphi-Quellcode:
procedure TMainFRM.btnuebernehmenClick(Sender: TObject);
var
  currentID: string;
  sqlstring: string;
begin
  qMain.SQL.Clear; // da du mit SQL.Text arbeitest ist die Zeile überflüssig
  qMain.Params.Clear; // da du mit SQL.Text arbeitest ist die Zeile überflüssig
  sqlstring:=edtsqlstring.text;
  if flag then
  begin
    // currentID zuweisen
    currentID:=lv.Selected.Caption;
    // SQL mit Parametern
    qMain.SQL.Text:='UPDATE KONTAKTE SET NAME= :NAM, VORNAME= :VNA, GEB= :GEB, STRASSE= :STR, Nr= :NR, PLZ= :PLZ, ORT= :ORT, TEL= :TEL, EMAIL= :EMA, BEMERKUNG= :BEM WHERE ID=:CID';
    qMain.ParamByName('CID').AsString:=currentID;
    qMain.ParamByName('NAM').AsString:=edtName.Text;
    qMain.ParamByName('VNA').AsString:=edtVorname.Text;
    qMain.ParamByName('GEB').AsString:=edtGeb.Text;
    qMain.ParamByName('STR').AsString:=edtStrasse.Text;
    qMain.ParamByName('Nr').AsString:=edtNr.Text;
    qMain.ParamByName('PLZ').AsString:=edtPLZ.Text;
    qMain.ParamByName('ORT').AsString:=edtOrt.Text;
    qMain.ParamByName('TEL').AsString:=edtTel.Text;
    qMain.ParamByName('EMA').AsString:=edtemail.text;
    qMain.ParamByName('BEM').AsString:=edtBemerkung.Text;
    // Ausführen des Update
    qMain.ExecSQL;
    // Listview neu einlesen
    refreshItems(currentID,edtName.Text,edtVorname.Text,edtGeb.Text,edtStrasse.Text,edtNr.Text,edtPLZ.Text,edtOrt.Text,edtTel.Text,edtemail.Text,edtBemerkung.Text);
    // Listview wieder leeren... Hä? :-)
    lv.Items.Clear;
    // Datenbank verbinden... Hä? :-) Die Verbindung wird im FormCreate gemacht. :-)
    Connect;
  end
PS: Im SQL select last_insert_rowid() muß die Klammer angegeben werden!

nahpets 16. Mai 2017 17:19

AW: ID nicht gefunden nach last_insert_rowid()
 
Bei 'nem
Delphi-Quellcode:
SELECT last_insert_rowid() AS ID
erwarte ich, dass die Ergebnisspalte ID heißt und nicht Column0.

haentschman 16. Mai 2017 17:29

AW: ID nicht gefunden nach last_insert_rowid()
 
Zitat:

erwarte ich, dass die Ergebnisspalte ID heißt und nicht Column0
:P ist sich SQLite... :wink: Aber du hast Recht. Aber wenn man nicht das bekommt was man erwartet, hilft der Debugger. :thumb:

Ich tippe darauf das das mit der Funktion zusammenhängt. Auch die Klammern müssen sein.

nahpets 16. Mai 2017 17:33

AW: ID nicht gefunden nach last_insert_rowid()
 
Ja, da der Quelltext aber erst seit ca. 'ner Stunde vorliegt, hat uns das gestern nicht so viel geholfen ;-)

DeddyH 16. Mai 2017 17:34

AW: ID nicht gefunden nach last_insert_rowid()
 
Na und? Die muss doch trotzdem den Alias als Spaltennamen zurückgeben. Ich mache das BTW immer mit FireDAC, da geht das bislang ohne Probleme und größere Verrenkungen.

haentschman 16. Mai 2017 17:39

AW: ID nicht gefunden nach last_insert_rowid()
 
Zitat:

Na und? Die muss doch trotzdem den Alias als Spaltennamen zurückgeben.
Ich kenne SQLite nicht wirklich. Vieleicht erkennt er an den () eine Funktion die keinen Alias verträgt. Weil er will dann auf den Alias ID zugreifen, den es nicht gibt. :wink:
Oder es sind die Komponenten...:gruebel: Verstehe das wer will. :P

Nachtrag:
Zitat:

Ja, da der Quelltext aber erst seit ca. 'ner Stunde vorliegt, hat uns das gestern nicht so viel geholfen
...stimmt. 8-)

nahpets 16. Mai 2017 17:42

AW: ID nicht gefunden nach last_insert_rowid()
 
Den Fehler gibt es unter Zeos nicht.
Daher meine Behauptung: DBExpress ist für diese Aufgabe wohl nicht erste Wahl.

EdAdvokat 16. Mai 2017 18:00

AW: ID nicht gefunden nach last_insert_rowid()
 
Ich kann noch immer nicht erkennen, wo ich welche Klammer vergessen habe.
Das grundsätzliche Vorgehen, um mit SQLite eine DB-Anwendung zu schreiben habe ich mir von einem Youtube-Video von Andreas Hiller abgeschaut und da war immer die Rede von qMain.SQL.Clear;
qMain.Params.Clear; usw. Danke Haentschmann ich werde das ganze nochmals überarbeiten. Das connect an der bewußten Stelle hat mir so richtig auch nicht gefallen, doch es war eine Lösung für
die Darstellung nur des aktuell bearbeiteten Datensatzes ohne die anderen DS.
Nach Bearbeiten wurde nur der bearbeitete DS danach dargestellt und die vorheriigen nicht mehr. Das refresh half auch nicht.
Leider kann ich euren aha-Aufschrei nicht nachvollziehen. Was konkret habe ich falsch gemacht???
Ich habe nochmals nachgesehen und festgestellt, dass ich sowohl im Zeos-Komp. Programm als auch im dbExpress-Programm stets geschrieben habe: qMain.SQL.Text:='SELECT LAST_INSERT_ROWID() AS ID FROM KONTAKTE';

nahpets 16. Mai 2017 18:13

AW: ID nicht gefunden nach last_insert_rowid()
 
Es geht nicht darum, ob Du was falsch gemacht hast oder nicht, sondern darum ob es mit DBExpress geht oder nicht.

Der Fehler, der von Deine Exe geworfen wird, ist logisch nicht nachvollziehbar.

Wenn man in 'nem SQL einen Alias für 'nen Spaltennamen angibt, also
Delphi-Quellcode:
select Funktion() as Spalte from Tabelle
schreibt, dann muss im Ergebnis die
Delphi-Quellcode:
qMain.FieldByName('SPALTE').AsString
funktionieren.

Wenn man in Deinem Programm also
Delphi-Quellcode:
SELECT last_insert_rowid() AS ID
eingibt, dann muss es im Ergebnis die Spalte ID geben, also
Delphi-Quellcode:
qMain.FieldByName('ID').AsString
verfügbar sein.

Dem ist aber nicht so. Das sieht für mich jetzt erstmal nach 'nem Fehler bei DBExpress aus, zumal das Ganze mit den Zeos-Komponenten ja funktioniert.

Und dass die SQLite-Datenbank bei identischen Statements aber unterschiedlichen Komponenten unterschiedliche Ergebnisse liefert, halte ich für eher unwahrscheinlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Seite 7 von 8   « Erste     567 8      

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