使用ADO Query参数(mysql / MyConnector)

今天我下载并安装了MyConnector,所以我可以将Mysql与ADO一起使用,一切安装完毕,OK!,我可以与ODBC建立连接并从我的delphi环境进行连接.

当我在runetime构建我的查询时,我得到一个错误说:

Project Project1.exe raised exception class EOleException with message ‘Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another’. Process stopped. Use Step or Run to continue.

function TForm1.CreateSQL : TADOQuery;
begin
  result := TADOQuery.create(self);
  with Result do
  begin
    Connection     := MainConnection;
    CursorLocation := clUseServer;
    CursorType     := ctStatic;
    CacheSize      := 50;
    AutoCalcFields := true;
    ParamCheck     := true;
    Prepared       := true;
  end;
end;

procedure TForm1.login();
begin
  with CreateSQL do
  try
    with SQL do
    begin
      add('SELECT                       ');
      add('  *                          ');
      add('FROM                         ');
      add('  LisenswebUsers             ');
      add('WHERE                        ');
      add('  UserName     = :MyUsername '); // debugger exception here
      add('AND                          ');
      add('  UserPassword = :MyPassword '); // debugger exception here
      with Parameters do
      begin
        ParamByName('MyUsername').value := txtLogin.text;
        ParamByName('MyPassword').value := strmd5(txtPassword.text);
      end;
      Open;

      if 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;
    end;
  finally
   free;
  end;
end;

最奇怪的是,如果我在delphi中关闭调试,这是有效的.

解决方法:

我会尝试在Adds周围添加SQL.BeginUpdate / SQL.EndUpdate,否则每次调用“Add”时都会解析SQL文本.

这通常是一个好主意,因为ADOQuery.SQL是一个TStringList,它具有一个设置CommandText的OnChange事件. SetCommandText文本然后最终调用TADOCommand.AssignCommandText,它执行相当多的工作来解析params,并设置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;

顺便说一句,嵌套用的是非常丑陋的(让圣战开始)

我有时会使用,但永远不会嵌套三个级别!如果是的话,至少要缩小SQL的范围,以便它在使用Parameters之前结束.

上一篇:我是否应该总是更喜欢使用准备好的SQL语句来获得性能优势?


下一篇:c# – 在asp.net web app上安装自定义odbc驱动程序