Бих опитал да добавя SQL.BeginUpdate/SQL.EndUpdate около Adds, в противен случай SQL текстът ще бъде анализиран всеки път, когато извикате „Add“.
Като цяло това е добра идея, тъй като ADOQuery.SQL е TStringList, който има събитие OnChange, което задава CommandText. След това текстът SetCommandText в крайна сметка извиква TADOCommand.AssignCommandText, който върши доста работа, анализирайки параметри и задавайки CommandObject.CommandText. Понякога драйверите ще се провалят с частични SQL изрази, но това изглежда добре.
Имах подобен проблем преди много години - затова научих за тези неща!
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;
Между другото, вложеното with
са наистина грозни (нека свещената война започне)
Понякога ще използвам with
, но никога не би вложил три нива! Ако сте, поне намалете обхвата на с SQL, така че да завършва преди с параметри.