第一种:ado 对象打开时,不允许操作(带参数查询)
delphi,用ADO操作数据库:
procedure TForm1.Button1Click(Sender: TObject); //*查询Bt*/
var
i :integer;
CurPage:integer;
NumEveryPage :integer;
begin
CurPage:=0;
NumEveryPage:=1000;
//1 ADOQuerySelect.Close;
//2 conn.Close;
conn.ConnectionString:=’Provider=MSDASQL.1;Persist Security Info=False;Data Source=MyAccessDatabase’;
conn.LoginPrompt:=false; //不要输入密码
ADOQuerySelect.SQL.Clear; //查询数据
sql:=’select * from ‘+ //查询语句,带参数量查询
‘ (select top %d * from ‘+
‘ (select top %d * from outputdata ‘ +
‘order by 日期 ‘+
‘ )’+
‘ order by 日期 desc ‘+
‘ )’+
‘order by 日期’;
ADOQuerySelect.SQL.add(Format(sql,[NumEveryPage,NumEveryPage*(CurPage+1)]));
ADOQuerySelect.Prepared;
ADOQuerySelect.Active:=True; //执行查询
//ADOQuery1.Active:=true;
end;
当再次按按钮时会提示:
对象打开时不允许操作 的异常。定位在ADOQuerySelect.SQL.Clear; //查询数据 这一行。
去网上找到原因是ADOQuerySelect 打开了。
1在开始的时候加入一句:ADOQuerySelect.Close;把它关闭吧。
运行发现conn.LoginPromot:=false那行也提示一样的错误。那就应该是把conn也关了。
2 conn.Close也加上,就是上面的代码注释的那两行加上就好了。
第二种:
问题的原因可能:
1、在其他地方已经打开这里没有用close先进行关闭在open
2、如果你的程序是多线程的活,虽然也写了close但是还会报错。
原因是当你这个线程到sql语句时程序跳到下一个线程执行了open,又回来执行前一个线程的open,就会报同样的错误
解决办法:
1、单线程就将close在sql语句之前,先关闭再打开
2、多线程时尽量不要使用同一个数据库控件,如果使用同一个则尽量在同一个线程里将所需功能处理。
第三种:我本人遇到的问题
只需要在开发模式中如图显示的报错原因

