今天我下载并安装了 MyConnector,这样我就可以通过 ADO 使用 Mysql,一切都安装好了!,我可以与 ODBC 连接并从我的 delphi 环境进行连接。
当我在运行时构建查询时,我收到一条错误消息:
项目 Project1.exe 引发异常类 EOleException,并显示消息“参数类型错误、超出可接受范围或相互冲突”。进程停止。使用“步骤”或“运行”继续。
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,它会执行大量解析参数的工作,并设置 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
s真的很丑(让圣战开始吧)
我有时会使用with
,但绝不会嵌套三层!如果是的话,至少缩小 with SQL 的范围,使其在 withParameters 之前结束。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)