मैं जोड़ने की कोशिश करूंगा SQL.BeginUpdate/SQL.EndUpdate चारों ओर जोड़ता है, अन्यथा हर बार जब आप "जोड़ें" कहते हैं तो SQL पाठ को पार्स किया जाएगा।
यह आम तौर पर एक अच्छा विचार है, क्योंकि ADOQuery.SQL एक TStringList है जिसमें एक ऑनचेंज ईवेंट है जो कमांडटेक्स्ट सेट करता है। 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;
BTW, नेस्टेड with
वास्तव में बदसूरत हैं (पवित्र युद्ध शुरू होने दें)
मैं कभी-कभी with
. का उपयोग करूंगा , लेकिन कभी भी तीन स्तरों पर घोंसला नहीं बनाएगा! यदि आप हैं, तो कम से कम SQL के साथ का दायरा कम करें ताकि यह पहले Parameters के साथ समाप्त हो जाए।