ado mysql xe_使用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之前结束.

标签:mysql,delphi,odbc

来源: https://codeday.me/bug/20190714/1456772.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值