Saya akan mencoba menambahkan SQL.BeginUpdate/SQL.EndUpdate di sekitar Adds, jika tidak, teks SQL akan diuraikan setiap kali Anda memanggil "Add".
Ini biasanya merupakan ide yang bagus, karena ADOQuery.SQL adalah TStringList yang memiliki event OnChange yang menyetel CommandText. Teks SetCommandText kemudian berakhir dengan memanggil TADOCommand.AssignCommandText yang melakukan cukup banyak parameter parsing kerja, dan menyetel CommandObject.CommandText. Terkadang driver akan gagal dengan pernyataan SQL parsial, tetapi hal ini terlihat OK.
Saya memiliki masalah yang sama bertahun-tahun yang lalu - itulah mengapa saya mempelajari hal ini!
procedure TForm1.login();
var
Qry : TADOQuery;
begin
Qry := CreateSQL;
try
Qry.SQL.BeginUpdate;
Qry.SQL.Add('SELECT');
Qry.SQL.Add(' *');
Qry.SQL.Add('FROM');
Qry.SQL.Add(' LisenswebUsers');
Qry.SQL.Add('WHERE UserName = :MyUsername '); // debugger exception here
Qry.SQL.Add(' AND UserPassword = :MyPassword '); // debugger exception here
Qry.SQL.EndUpdate;
Qry.Parameters.ParamByName('MyUsername').value := txtLogin.text;
Qry.Parameters.ParamByName('MyPassword').value := strmd5(txtPassword.text);
Qry.Open;
if Qry.Recordcount <> 1 then
begin
lblLoggedinAs.Text := format('Du er logget inn som: %s (%s)',[FieldByName('Username').AsString,FieldByName('UserEmailaddress').AsString]);
MainPageControl.ActivePageIndex := 1;
end
else
begin
txtPassword.Text := '';
txtPassword.SetFocus;
end;
finally
Qry.Free;
end;
end;
BTW, with
bersarang s benar-benar jelek (biarkan perang suci dimulai)
Saya terkadang menggunakan with
, tetapi tidak akan pernah bersarang tiga level! Jika ya, setidaknya kurangi cakupan dengan SQL sehingga diakhiri dengan Parameter.