Einfügen in DB mit ADOQuery? -> Parameter inkonsistent??
-
Hallo, ich habe eine ADOQuery, verbunden mit einer ADOConnection mit Accessdatenbank (*.mdb).
Die SQL-Eigenschaft der Query ist:insert into tbl_schadenarten ( sa_id,sa_name,sa_beschreibung ) values ( :sanr, :saname, :sabeschreibung )
Der Fehler, der kommt, wenn ich auf einen Button klicke:
Erste Gelegenheit für Exception bei $770BFBAE. Exception-Klasse EOleException mit Meldung 'Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben'. Prozess Projekt.exe (5468)
Code des Buttons:
// schauen, ob Eintrag schon vorhanden Boolean SchonDa = true ; for (int i = 0 ; i < GutachtenList->Items->Count ; i++) { if (GutachtenEdit->Text == GutachtenList->Items->Strings[i]) { SchonDa = False ; break; } } // wenn Eintrag noch nicht vorhanden, dann einfügen if (SchonDa) { GutachtenList->Items->Add(GutachtenEdit->Text) ; SpeicherBtn->Enabled = true ; CancelBtn->Enabled = true ; CloseBtn->Enabled = false ; } else { MessageBeep(0) ; ShowMessage("Diesen Eintrag gibt es schon!") ; return ; } // in Datenbank einfügen insert_gutachten->Close() ; insert_gutachten->Parameters->ParamByName("saname")->Value = GutachtenEdit->Text ; insert_gutachten->ExecSQL() ; GutachtenEdit->Text = "" ; GutachtenEdit->SetFocus() ;
-
MichelM schrieb:
insert into tbl_schadenarten ( sa_id,sa_name,sa_beschreibung ) values ( :sanr, :saname, :sabeschreibung )
insert_gutachten->Close() ; insert_gutachten->Parameters->ParamByName("saname")->Value = GutachtenEdit->Text ; insert_gutachten->ExecSQL() ;
du definierst in deinem SQL-Kommando 3 Parameter setzt dann im Quellcode aber nur einen und das löst den Fehler aus, da der Komponente die anderen beiden Werte fehlen
falls du die Werte leer lassen willst mußt du folgendes verwenden, z.B.:
insert_gutachten->Parameters->ParamByName("sabeschreibung")->Value.Clear();
falls sa_id eine automatische ID ist, darfst du sie garnicht mit ins SQL-Kommando nehmen
-
Alles klar, das verstehe ich
Die ID habe ich rausgenommen (weil eindeutig) und für 'sabeschreibung' habe ich Value.Clear() eingefügt.
Nun gibt es aber das Problem, dass er den Parameter 'saname' nicht finden kann! Muss ich da noch im Feldeditor Felder für die Parameter erstellen?
-
zeig bitte nochmal den relevanten Quellcode und das SQl-Kommando, denn bei deiner ersten Version hattest du ja bis auf die Befüllung der Parameter soweit alles richtig
-
insert into tbl_schadenarten ( sa_name,sa_beschreibung ) values ( :saname, :sabeschreibung )
// in Datenbank einfügen insert_gutachten->Close() ; insert_gutachten->SQL->Clear() ; insert_gutachten->Parameters->ParamByName("saname")->Value = GutachtenEdit->Text ; insert_gutachten->Parameters->ParamByName("sabeschreibung")->Value.Clear() ; insert_gutachten->Open() ; insert_gutachten->ExecSQL() ;
Fehler (während der Laufzeit bei Ausführung dieses Codes):
Erste Gelegenheit für Exception bei $76F3FBAE. Exception-Klasse EDatabaseError mit Meldung 'insert_gutachten: Parameter 'saname' nicht gefunden'. Prozess Projekt.exe (3320)
-
also mal der grobe Ablauf deiner Anweisungen:
MichelM schrieb:
// in Datenbank einfügen insert_gutachten->Close() ; // 1. Schließen des Query insert_gutachten->SQL->Clear() ; // 2. Text aus dem Query entfernen insert_gutachten->Parameters->ParamByName("saname")->Value = GutachtenEdit->Text ; // 3. Parameter 1 setzen insert_gutachten->Parameters->ParamByName("sabeschreibung")->Value.Clear() ; // 4. Parameter 2 setzen insert_gutachten->Open() ; // 5. Query öffnen insert_gutachten->ExecSQL() ; // 6. Query ausführen
fällt dir was auf? es sind genau 2 Fehler: zum einen hast du durch 2. gar kein SQL-Kommando mehr im Query und zum anderen solltest du dir die Verwendung von Open und ExecSQL mal anschauen, denn eines der beiden ist hier überflüssig
-
Ja das stimmt, das ist eigentlich ziemlich dämlich!!
Aber wenn ich das SQL->Clear() herausnehme, dann kommt wieder der Fehler mit dem inkonsistenten Parameter ... Egal, ob danach ->Open() oder -> ExecSQL() steht!
-
lass dir doch mal ausgeben was in SQL steht (nach dem Schließen und vor der Parameterzuweisung:
ShowMessage(insert_gutachten->SQL->Text);
noch ne Frage: hast du ParamCheck auf true?
-
ja ParamCheck ist auf true ... wenn ich das auf false umstelle, ändert sich nichts!
Mit ShowMessage(...) zeigt er mir genau das an, was ich vorher eingegeben hatte, also es gibt keine Änderung.
-
eine Änderung sollte es ja auch nicht geben, ich wollte nur sichergehen, daß in deinem Query das richtige SQL-Kommando (also das mit den 2 Parametern, ohne die id) steht
die Fehlermeldung deutet immernoch darauf hin, dass ein Parameter fehlt
versuch nochmal folgenden Quellcodeinsert_gutachten->Close() ; // 1. Schließen des Query insert_gutachten->SQL->Clear() ; // 2. Text aus dem Query entfernen insert_gutachten->SQL->Add("insert into tbl_schadenarten (sa_name, sa_beschreibung) values (:saname, :sabeschreibung) "); //3. Query füllen insert_gutachten->Parameters->ParamByName("saname")->Value = GutachtenEdit->Text ; // 4. Parameter 1 setzen insert_gutachten->Parameters->ParamByName("sabeschreibung")->Value.Clear() ; // 5. Parameter 2 setzen insert_gutachten->ExecSQL() ; // 6. Query ausführen
noch etwas: ist der Wert von "GutachtenEdit->Text" vielleicht leer? eventuell liegts dann daran
-
Hey Linnea, super! Es klappt! Was jetzt falsch war, habe ich noch nicht wirklich verstanden, aber es funktioniert!
Das Edit war natürlich nicht leer! Wollte doch zum Testen auch was eingeben, sonst sieht man ja nicht obs funktioniert hat
Außerdem habe ich sowas vorher schon abgefangen!