Tôi sẽ thử thêm SQL.BeginUpdate / SQL.EndUpdate xung quanh Thêm, nếu không văn bản SQL sẽ được phân tích cú pháp mỗi khi bạn gọi "Thêm".
Đây thường là một ý tưởng hay, vì ADOQuery.SQL là một TStringList có sự kiện OnChange đặt CommandText. Văn bản SetCommandText sau đó kết thúc gọi TADOCommand.AssignCommandText thực hiện một lượng lớn công việc phân tích cú pháp các tham số và thiết lập CommandObject.CommandText. Đôi khi trình điều khiển sẽ không thành công với các câu lệnh SQL một phần, nhưng công cụ này có vẻ ổn.
Tôi đã gặp vấn đề tương tự nhiều năm trước - đó là lý do tại sao tôi tìm hiểu về vấn đề này!
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
s thực sự xấu xí (hãy để thánh chiến bắt đầu)
Đôi khi tôi sẽ sử dụng with
, nhưng sẽ không bao giờ lồng ba cấp độ! Nếu đúng như vậy, ít nhất hãy giảm phạm vi của SQL để nó kết thúc trước bằng Tham số.