下面的代码怎么老是有问题,说ADOQuery1:cannot perform this operation on an open dataset(50分)

  • 主题发起人 主题发起人 doose
  • 开始时间 开始时间
D

doose

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TfrmLogin.FormCreate(Sender: TObject);
begin
digit:=1; {次数初值为1,标志位初值为0}
Flag:=0;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from EmployeeInfo');
ADOQuery1.Open;
while not ADOQuery1.Eof do
begin
mUserName.Items.Add(Trim(ADOQuery1.FieldValues['EmployeeName']));
ADOQuery1.Next;
end;
mUserName.ItemIndex := 0;
end;

procedure TfrmLogin.BitBtn1Click(Sender: TObject);
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from EmployeeInfo where EmployeeName=''' + mUserName.Text + '''');
ADOQuery1.Open;
if (not ADOQuery1.Eof) and (Trim(ADOQuery1.FieldValues['Password']) = mPassword.Text) then
Close;
end;
 
这是说: 不能在打开的数据集上进行此操作。
一般在重置SQL语句时检查,因此,错误出在你的 ADOQuery1.SQL.Clear;上,应该在前面
加上一句:
if AdoQuery1.Active then AdoQuery1.Close;

我一般这么写:
with AdoQuery1 do begin
if Active then Close;
SQL.Clear;
....
 
ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
VCL源码的Open方法是
Active:=True;
所以,Open用
Active:=True;
Close用
Active:=false;
快一点,书上这么说的,不过,我不知道性能会有什么提高:(
 
如楼上的兄弟所说
我的做法一般是:
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('');
Open;
end
 
同意楼上
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('');
Open;
end
这是一般格式,你的代码太麻烦了



 
后退
顶部