用delphi写的这个代码运行出现错误提示

procedure TForm1.BitBtn1Click(Sender: TObject);
var
password:string;
UserName:string;
QX:string;
logintimes:integer;
begin
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select 密码,权限 from f_user');
adoquery1.SQL.Add('where 姓名=:姓名');
adoquery1.Parameters.ParamByName('姓名').Value:=ComboBox1.Text;
adoquery1.Open;
if adoquery1.RecordCount>0 then
begin
password:=adoquery1.FieldValues['密码'];
if edit1.Text=password then
begin
UserName:=ComboBox1.Text;
self.Hide;
QX:=adoquery1.FieldValues['权限'];
with form2.Create(nil) do
try
ShowModal;
finally
free;
end;
end
else
begin
logintimes:=logintimes+1;
if logintimes<3 then
begin
messagebox(handle,pchar('密码'+inttostr(logintimes)+
'次错误,请重新摄入!'),'密码错误',mb_ok or mb_iconerror);
edit1.Text:='';
edit1.SetFocus;
end
else
begin
messagebox(handle,'密码三次错误请关闭!','密码错误',mb_iconerror);
application.Terminate;
end;
end;
end;
adoquery1.Close;
freeandnil(adoquery1);

end;

freeandnil(adoquery1);
最后这句去掉看看还报地址错误吗,
你得断点查询,地址错误一般是找不到数据库的对应数据。我以前也经常碰到,要不有可能是
定位错误 with form2.Create(nil) do 这个是什么意思看不懂,我给你我们的代码你参考下吧
function runsql(qu:Tquery;str:string):string;
begin
qu.close;
qu.sql.clear;
qu.sql.add(str);
qu.ExecSQL;
end;

function runsql2(qu:Tquery;str:string):string;
begin
qu.close;
qu.sql.clear;
qu.sql.add(str);
qu.open;
END;
//账号密码的时间限制
//--------------------------------------------------------------------------------------------------
runsql2(dm.passquery,'select * from password where uidname="' +trim(edit1.text)+ '"');
runsql2(query1,'select getdate() as dat');

if dm.passquery.FieldByName('stop').asstring='Y' then
begin
showmessage('你的账号已经冻结');
application.Terminate;
end;

IF LENGTH(DM.PASSQuery.FieldByName('PASSWORDS').ASSTRING)<6 THEN
BEGIN
showmessage('你的密码长度不足六位!请修改你的密码,否则你的账号将被冻结!');
runsql(query2,'update password set stop="Y" where uidname="'+trim(edit1.text)+'"');
END;

if ((query1.FieldByName('dat').AsDateTime-dm.passquery.FieldByName('C_date').AsDateTime)>dm.passquery.fieldbyname('u_day').AsInteger) AND (DM.passquery.FieldByName('U_DAY').ASINTEGER<>0) then
begin
showmessage('你的账号已经过期');
runsql(query2,'update password set stop="Y" where uidname="'+trim(edit1.text)+'"');
application.Terminate;
end;

if dm.passquery.FieldByName('uidname').asstring=DM.passquery.FieldByName('passwords').asstring then
begin
showmessage('你的密码与用户名相同,请立即更改密码!');
runsql(query2,'update password set stop=''Y'' where uidname="'+trim(edit1.text)+'"');
end
else if ((query1.FieldByName('dat').AsDateTime)-dm.passquery.FieldByName('C_date').AsDateTime>dm.passquery.FieldByName('u_day').AsInteger-10) AND (DM.passquery.FieldByName('U_DAY').ASINTEGER<>0) then
begin
showmessage('你的账号离到期不超过10天,请尽快更改你的密码,否则你的账号将被冻结!');
end;

query2.Close;
query2.Params.Clear;
query2.SQL.Text := 'update password set l_date=:l_date where uidname="'+edit1.text+'"';
query2.Params.ParamByName('l_date').AsDateTime := query1.FieldByName('dat').AsDateTime;
query2.ExecSQL;追问

freeandnil(adoquery1);
这个去掉了 还是报错啊

追答

那就需要断点查询 你F7到哪一行报错的?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-08
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select 密码,权限 from f_user');
adoquery1.SQL.Add('where 姓名=:姓名');
adoquery1.Parameters.ParamByName('姓名').Value:=ComboBox1.Text;
adoquery1.Open;

会不会是不支持用汉字做参数?
你把sql语句改成 where 姓名=:@Name 试试看
第2个回答  2012-03-07
不是动态创建的ADOQuery1,无需释放
相似回答