Fehler bei SQLite3, findet nicht das was da ist

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Aphadias »

moin

ich versuche mal mein Problem so gut wie es geht zu erklären. Ich habe schon seit bestimmt jetzt ein halbes Jahr eine DB (SQLite3) in benutzung. Ging immer tadelos. So ich wollte jetzt nun aber diese Tabelle mit Werten erweitern. Um ein Datenbank-Chaos zu vermeiden habe ich die hinten ran gesetzt an den letzten Datensatz ("datum5").

die Spalten sind also menge1 charge1 datum1 .... bla bla bla .... menge5 charge5 datum5 danach jetzt neu -> soll insgesamt einheit1...... einheit5

es sind nur Daten dazwischen geschoben in meiner Tabelle zum Ansehen aber in der DB ist alles Neue hinten dran. Nur habe ich jetzt das Problem das er Datum5 nicht mehr kennt!

als Fehler öffnet sich ein neues Fenster mit 000000010029B533 498b442420 mov 0x20(%r12),%rax
und vorher sagte er mir querymat: Field not found: "datum5"

Jetzt kommt der Witz dabei..... erschreibt es trotzdem an die richtige Stelle in der DB!!!!! :shock:

ich fühle mich da leicht verarscht.... ich habe nichts irgend wie geändert sondern alles neue nur hinten dran gesetzt. Da er es trotzdem in die Datenbank schreibt verstehe ich nicht warum er es denn nicht findet.
Wenn ich es editiere und abspeichere übernimmt er es ohne zu meckern aber sobald ich es neu anlege dann meckert er rum.

Seit 3 Tagen versuche ich nun den Fehler zu finden im Quelltext aber es ist nichts zu finden und wieso schreibt er trotzdem in die Datenbank?!

Code: Alles auswählen

//Parameter anlegen
    Fstart.querymat.SQL.Clear;
    Fstart.querymat.Params.Clear;
 
    Fstart.querymat.Params.CreateParam(ftString,'name',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'lage',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftInteger,'soll',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftInteger,'insgesamt',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftInteger,'menge1',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'einheit1',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'charge1',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftDate,'datum1',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftInteger,'menge2',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'einheit2',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'charge2',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftDate,'datum2',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftInteger,'menge3',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'einheit3',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'charge3',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftDate,'datum3',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftInteger,'menge4',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'einheit4',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'charge4',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftDate,'datum4',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftInteger,'menge5',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'einheit5',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftString,'charge5',ptInputOutput);
    Fstart.querymat.Params.CreateParam(ftDate,'datum5',ptInputOutput);

Code: Alles auswählen

//Parameter beschreiben
Fstart.querymat.ParamByName('name').Text:=Fmat.name.Text;
    Fstart.querymat.ParamByName('lage').Text:=Fmat.lagerort.Text;
    if soll.Text = '' then
      Fstart.querymat.ParamByName('soll').Clear
    else
      Fstart.querymat.ParamByName('soll').AsInteger:=strtoint(Fmat.soll.Text);
    Fstart.querymat.ParamByName('insgesamt').AsInteger:=total;
    if menge1.Text = '' then
      Fstart.querymat.ParamByName('menge1').Clear
    else
      Fstart.querymat.ParamByName('menge1').AsInteger:=strtoint(Fmat.menge1.Text);
    Fstart.querymat.ParamByName('einheit1').Text:=Fmat.einheit1.Text;
    Fstart.querymat.ParamByName('charge1').Text:=Fmat.charge1.Text;
    if datetostr(Fmat.datum1.Date) <> '01.01.2017' then
      Fstart.querymat.ParamByName('datum1').AsDate:=Fmat.datum1.Date;
 
    if menge2.Text = '' then
      Fstart.querymat.ParamByName('menge2').Clear
    else
      Fstart.querymat.ParamByName('menge2').AsInteger:=strtoint(Fmat.menge2.Text);
    Fstart.querymat.ParamByName('einheit2').Text:=Fmat.einheit2.Text;
    Fstart.querymat.ParamByName('charge2').Text:=Fmat.charge2.Text;
    if datetostr(Fmat.datum2.Date) <> '01.01.2017' then
      Fstart.querymat.ParamByName('datum2').AsDate:=Fmat.datum2.Date;
 
    if menge3.Text = '' then
      Fstart.querymat.ParamByName('menge3').Clear
    else
      Fstart.querymat.ParamByName('menge3').AsInteger:=strtoint(Fmat.menge3.Text);
    Fstart.querymat.ParamByName('einheit3').Text:=Fmat.einheit3.Text;
    Fstart.querymat.ParamByName('charge3').Text:=Fmat.charge3.Text;
    if datetostr(Fmat.datum3.Date) <> '01.01.2017' then
      Fstart.querymat.ParamByName('datum3').AsDate:=Fmat.datum3.Date;
 
    if menge4.Text = '' then
      Fstart.querymat.ParamByName('menge4').Clear
    else
      Fstart.querymat.ParamByName('menge4').AsInteger:=strtoint(Fmat.menge4.Text);
    Fstart.querymat.ParamByName('einheit4').Text:=Fmat.einheit4.Text;
    Fstart.querymat.ParamByName('charge4').Text:=Fmat.charge4.Text;
    if datetostr(Fmat.datum4.Date) <> '01.01.2017' then
      Fstart.querymat.ParamByName('datum4').AsDate:=Fmat.datum4.Date;
 
    if menge5.Text = '' then
      Fstart.querymat.ParamByName('menge5').Clear
    else
      Fstart.querymat.ParamByName('menge5').AsInteger:=strtoint(Fmat.menge5.Text);
    Fstart.querymat.ParamByName('einheit5').Text:=Fmat.einheit5.Text;
    Fstart.querymat.ParamByName('charge5').Text:=Fmat.charge5.Text;
    if datetostr(Fmat.datum5.Date) <> '01.01.2017' then
      Fstart.querymat.ParamByName('datum5').AsDate:=Fmat.datum5.Date;


Code: Alles auswählen

//SQL Befehl zum neu Anlegen
Fstart.querymat.SQL.Text:='insert into mat (name,lage,menge1,charge1,datum1,menge2,charge2,datum2,menge3,charge3,datum3,menge4,charge4,datum4,menge5,charge5,datum5,soll,insgesamt,einheit1,einheit2,einheit3,einheit4,einheit5)'+
                                         'values (:name,:lage,:menge1,:charge1,:datum1,:menge2,:charge2,:datum2,:menge3,:charge3,:datum3,:menge4,:charge4,:datum4,:menge5,:charge5,:datum5,:soll,:insgesamt,:einheit1,:einheit2,:einheit3,:einheit4,:einheit5)';
 
      Fstart.querymat.ExecSQL;

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Epcop »

ganz kurz:
Kannst du den Text im letzten Feld noch lesbar reinschreiben? irgendwo ein leerzeichen, damit ein zeilenumbruch reingeht und der text ganz zu sehen ist

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Epcop »

Bei welcher Zeile stoppt er denn mit der Meldung??

Also Konkret habe ich im Code nichts gefunden.


Ein paar Anregungen:


=> Was passiert eigentlich, wenn datetostr(Fmat.datum5.Date) gleich "01.01.2017" ist? Dann fällt ja das ...parambyname datum5... raus. (Kann es evtl. mit dem Jahreswechsel zusammenhängen 01.01.2017 statt 01.01.2018, o.ä.?).

Was steht eigentlich nach der letzten if datetostr(Fmat.datum5.Date)? kommt ...parambyname datum5... dann nochmal vor in irgendeiner art? Die Daten die gespeichert weden, sind das auch wirklich die richtigen?


- Woher kommt der Inhalt von Fmat.datum5.Date? Gibt es überhaupt ein "datetostr(Fmat.datum5.Date)"? Was steht dort drinnen?
- Gibt es noch andere Querys, die du noch nicht aktualisiert hast? Vielleicht als "Default" irgendwo?
- Hast du vielleicht mehrere SQLite DB angelegt und den Pfad o.ä. noch nicht verändert?
- Projekt gespeichert und "Neu kompilieren" schon versucht?
- datum5 ist auch wirklich wirklich in der richtigen Tabelle in der DB?
- Gibt es vielleicht irgendwo ein fehlerhaftes Select mit datum5?

Soner
Beiträge: 622
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Soner »

Das hört sich wieder nach persistente Felder an. Klick auf deine Datenbankkomponente (Fstart ?) mit rechten Maustaste und wähle aus dem Menu "Felder bearbeiten".
Genau diesen Fehler bekommt man, wenn man einmal persistente Felder erstellt und später SQL-Erweitert. Da kann man Stundenlang nach Fehler suchen.
Wenn ich persistente Felder benutze mache ich immer vor Implementation immer so ein Notiz:
"ACHTUNG PERSISTENTE FELDER"

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Aphadias »

Epcop hat geschrieben:ganz kurz:
Kannst du den Text im letzten Feld noch lesbar reinschreiben? irgendwo ein leerzeichen, damit ein zeilenumbruch reingeht und der text ganz zu sehen ist


hier noch mal verbessert

Code: Alles auswählen

Fstart.querymat.SQL.Text:='insert into mat (name,lage,menge1,charge1,datum1,menge2,charge2,datum2,menge3,charge3,datum3,menge4,charge4,
datum4,menge5,charge5,datum5,soll,insgesamt,einheit1,einheit2,einheit3,einheit4,einheit5)'
+
                                         'values (:name,:lage,:menge1,:charge1,:datum1,:menge2,:charge2,:datum2,:menge3,:charge3,:datum3,:menge4,:charge4
,:datum4,:menge5,:charge5,:datum5,:soll,:insgesamt,:einheit1,:einheit2,:einheit3,:einheit4,:einheit5)'
;
 
      Fstart.querymat.ExecSQL


Epcop hat geschrieben:Bei welcher Zeile stoppt er denn mit der Meldung??

Also Konkret habe ich im Code nichts gefunden.


Ein paar Anregungen:


=> Was passiert eigentlich, wenn datetostr(Fmat.datum5.Date) gleich "01.01.2017" ist? Dann fällt ja das ...parambyname datum5... raus. (Kann es evtl. mit dem Jahreswechsel zusammenhängen 01.01.2017 statt 01.01.2018, o.ä.?).

Was steht eigentlich nach der letzten if datetostr(Fmat.datum5.Date)? kommt ...parambyname datum5... dann nochmal vor in irgendeiner art? Die Daten die gespeichert weden, sind das auch wirklich die richtigen?


- Woher kommt der Inhalt von Fmat.datum5.Date? Gibt es überhaupt ein "datetostr(Fmat.datum5.Date)"? Was steht dort drinnen?
- Gibt es noch andere Querys, die du noch nicht aktualisiert hast? Vielleicht als "Default" irgendwo?
- Hast du vielleicht mehrere SQLite DB angelegt und den Pfad o.ä. noch nicht verändert?
- Projekt gespeichert und "Neu kompilieren" schon versucht?
- datum5 ist auch wirklich wirklich in der richtigen Tabelle in der DB?
- Gibt es vielleicht irgendwo ein fehlerhaftes Select mit datum5?


01.01.2017 ist mein NULL Date und hatte damit probleme wegen NULL in der Datenbank. Deswegen habe ich es erst mal abgefangen und es gab noch nie Probleme damit. Später will ich es noch mal verbessern. Aber wenn was anderes als 01.01.2017 da steht dann wird das Datum dann bearbeitet.
Ne es ist die einzigste Query die ich verändert habe.
Ja habe mehrere DB aber der Pfad wurde nicht geändert.
Neu kompilieren versuche ich gleich mal.... hatte noch nicht daran gedacht 8)
datum5 ist in der richtigen Tab. ;)
Ich finde kein fehlerhaftes Select mit Datum5.

Soner hat geschrieben:Das hört sich wieder nach persistente Felder an. Klick auf deine Datenbankkomponente (Fstart ?) mit rechten Maustaste und wähle aus dem Menu "Felder bearbeiten".
Genau diesen Fehler bekommt man, wenn man einmal persistente Felder erstellt und später SQL-Erweitert. Da kann man Stundenlang nach Fehler suchen.
Wenn ich persistente Felder benutze mache ich immer vor Implementation immer so ein Notiz:
"ACHTUNG PERSISTENTE FELDER"


ich prüfe mal und melde mich dann noch mal

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Aphadias »

Soner hat geschrieben:Das hört sich wieder nach persistente Felder an. Klick auf deine Datenbankkomponente (Fstart ?) mit rechten Maustaste und wähle aus dem Menu "Felder bearbeiten".
Genau diesen Fehler bekommt man, wenn man einmal persistente Felder erstellt und später SQL-Erweitert. Da kann man Stundenlang nach Fehler suchen.
Wenn ich persistente Felder benutze mache ich immer vor Implementation immer so ein Notiz:
"ACHTUNG PERSISTENTE FELDER"


habe ebend noch mal geschaut und habe dort keine Felder drinne.... ist alles leer

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Epcop »

Zeigt er dir die fehlerhafte Zeile an, die Schuld sein soll?

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Aphadias »

Nein leider nicht... ich verstehe auch nicht warum er es in die Datenbank schreibt obwohl er das Programm abbricht... hier die Fehler

https://photos.app.goo.gl/HT6ESfuoIX3CNCgj1

https://photos.app.goo.gl/NFnmXVDVTWqErfft2

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Aphadias »

ICH HABE ES ENDLICH GEFUNDEN!!!!

Also leider sehe ich gerade das ich oben euch noch ein bisschen Quelltext verschwiegen habe :oops:

Es war wie ich mir es schon dachte ein CopyPaste Fehler... Meine Vermutung lag in den letzten Wochen schon bei der ListView... heute dachte ich erst... au man.. Schreibfehler aber schlimmer... Bei Neu Anlegen ist ja noch nix in die Datenbank geschrieben und der Listview eintrag sollte wie beim Einlesen aus der Datenbank geschrieben werden was falsch ist. Habe es jetzt umgeschrieben das er die Daten aus der Maske nimmt und jetzt geht es wieder... trotzdem danke euch alle :mrgreen:

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Epcop »

Wie hast du den Fehler gefunden?

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Fehler bei SQLite3, findet nicht das was da ist

Beitrag von Aphadias »

Eigentlich durch Zufall...

Code: Alles auswählen

if datetostr(datum5.Date) <> '01.01.2017' then
      begin
        date5:=datetostr(datum5.Date);
      end
      else
      begin
        date5:='';
      end;
 
      listviewspeichern(id,name.Text,lagerort.Text,soll.Text,insgesamt.Caption,menge1.Text,einheit1.Text,charge1.Text,date1,menge2.Text,einheit2.Text,charge2.Text,date2,menge3.Text,einheit3.Text,charge3.Text,date3,menge4.Text,einheit4.Text,charge4.Text,date4,menge5.Text,einheit5.Text,charge5.Text,date5);
 


weil ich hatte mir so die Variable noch mal angesehen von date5 und überlegte so...... bei Listview speichern stand bis dato noch Fstart.querymat.FieldByName('Datum5').AsDate dort hatte es dann klick gemacht und dachte erst mal nur... boah ey da steht datum und nicht Date5. 5 sek später machte es gleich weiter klick wie ich so die Zeile sah das es ja komplett falsch war.... und so änderte ich das listview ab so wie es jetzt hier steht...

es sollte ja aus den variablen erst mal geschrieben werden und nicht aus der leeren Datenbank zeile

Antworten