Problem mit ADOQuery und Parameter...
-
Hallo,
ich gebe in einem ADOQuery einen SQL-String mittels Parameter aus. Bei dieser Abfrage handelt es sich um eine Benutzername & Passwort-Abfrage. Wenn ich nun beim ersten Versuch ein falsches Passwort angebe, bekomme ich die richtige Meldung dazu. Nun ändere ich das Passwort und schicke diesen SQL-String nochmals ab.Nun bekomme ich folgende Fehlermeldung:Exception-Klasse EOleException mit Meldung 'Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben'. Prozess Massnahmen.exe (5364)Hier nun mein Code dazu:
void __fastcall TFMain::BitBtn1Click(TObject *Sender) { //Login eines Users DM1->Q_login->Parameters->CreateParameter("P_username", ftString, pdInput, 10, NULL); DM1->Q_login->Parameters->CreateParameter("P_passwort", ftString, pdInput, 10, NULL); DM1->Q_login->Parameters->ParamByName("P_username")->Value = Edit1->Text; DM1->Q_login->Parameters->ParamByName("P_passwort")->Value = Edit2->Text; DM1->Q_login->Close(); DM1->Q_login->SQL->Clear(); DM1->Q_login->SQL->Add("select benutzername, passwort from t_user where benutzername = :P_username AND passwort = :P_passwort"); DM1->Q_login->Open(); if (DM1->Q_login->RecordCount != 0) { FTerminal->Visible = true; this->Visible = false; } else MessageDlg("Falscher Benutzername oder Passwort!",mtError ,TMsgDlgButtons() << mbOK ,0); }Ich habe den Wert der Parameter auch schon nach der Eingabe abgefragt. Es steht das richtige drin...?
Kann mir da jemand helfen?
-
Der Grund für die Fehlermeldung ist wahrscheinlich, daß du bei jedem Click auf den BitButton neue Parameter erzeugst (CreateParameter), d.h. du erzeugst mehr Parameter als du verwendest und dann noch mit gleichem Namen. Entweder du läßt
a) die beiden Zeilen mit dem CreateParameter weg und schreibst die Wertezuweisung zu den Parametern zwischen DM1->Q_login->SQL->Add und
DM1->Q_login->Open() (Hinweis: bei der Wertezuweisung "erkennt" der Parameter automatisch welcher Typ das ist) oder
b) du fragst vor dem CreateParameter ab, ob der Parameter schon besteht.Beispiel zu a):
void __fastcall TFMain::BitBtn1Click(TObject *Sender) { //Login eines Users DM1->Q_login->Close(); DM1->Q_login->SQL->Clear(); DM1->Q_login->SQL->Add("select benutzername, passwort from t_user where benutzername = :P_username AND passwort = :P_passwort"); DM1->Q_login->Parameters->ParamByName("P_username")->Value = Edit1->Text; DM1->Q_login->Parameters->ParamByName("P_passwort")->Value = Edit2->Text; DM1->Q_login->Open(); if (DM1->Q_login->RecordCount != 0) { FTerminal->Visible = true; this->Visible = false; } else MessageDlg("Falscher Benutzername oder Passwort!",mtError ,TMsgDlgButtons() << mbOK ,0); }
-
Hallo,
ich habe es nun so gemacht wie Du es in a) vorgeschlagen hast. Es funktioniert

Aber komisch ist es ja schon, erst den SQL-String mit Parametern zusammenzubauen und anschl. erst die Parameter erstellen und mit Daten füllen

VIELEN DANK!
-
torsten_156 schrieb:
Hallo,
ich habe es nun so gemacht wie Du es in a) vorgeschlagen hast. Es funktioniert

Aber komisch ist es ja schon, erst den SQL-String mit Parametern zusammenzubauen und anschl. erst die Parameter erstellen und mit Daten füllen

VIELEN DANK!
Du kannst die Parameter auch vor dem select schreiben.
Der Knackpunkt liegt eher bei Close und Clear.