各位 TADOQuery怎么释放句柄?
EG:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyAdo : TADOQuery;
begin
  try
    MyAdo := TADOQuery.Create(nil);
    MyAdo.ConnectionString := 
    'Provider=OraOLEDB.Oracle.1;Password= pass;Persist Security Info=True;User ID= user ;Data Source= dbtest';
    MyAdo.SQL.Text := 'select * form db1 where id =1'; //到这里就看到产程有句柄了
    MyAdo.Open;
    Appliaction.MessageBox(MyAdo.FieldByName('Name').AsString,'查到的姓名',mb_ok);
    MyAdo.Close;
    MyAdo.Free; //或者用FreeAndNil(MyAdo); 一样释放不掉句柄
  except
    MyAdo.Free;
  end;
end;这里产生的句柄到底怎么释放呀??? 在Windows XP 的任务管理器中看句柄 调用一次 句柄就加一次,不下降,内存是释放了,但是就句柄不释放。
请问高人们,到底怎么释放? 
如果不释放的话 是不是会有问题??
一般句柄到多少会出问题?????

解决方案 »

  1.   

    这个句柄我也不知道怎么获得,但是在WINDOWS XP下却是有句柄创建,但是不释放,每次增加2个
      

  2.   

    最好用
    try
     ...
    fianlly
     FreeAndNil(obj);
    end;
      

  3.   

    查了好多资料,都没有说ADO数据集连接释放问题, 那是不是只有在程序创建的时候创建ADO? 其他地方都不要FREE掉ADO,只CLOSE就就释放掉内存的占用了???? 
      

  4.   

    Appliaction.MessageBox(MyAdo.FieldByName('Name').AsString,'查到的姓名',mb_ok);
    MyAdo.Close;
    MyAdo.Free; //或者用FreeAndNil(MyAdo); 一样释放不掉句柄
    MyAdo :=nil ;  
      

  5.   

    if(MyAdo=nil)
    then 

     MyAdo := TADOQuery.Create(nil);
      

  6.   

    try 
          MyAdo := TADOQuery.Create(nil);
    finally 
          MyAdo.free             
          MyAdo.Handle:=0;
      

  7.   

    try
      MyAdo := TADOQuery.Create(nil);  ....
    finally
      MyAdo.free;
    end;
      

  8.   

    这得问比尔·盖茨老先生为啥设计成这样啦
      

  9.   

    FreeAndNil(obj); 应该可以才对,
    我用Tadoquery打开mdb,FreeAndNil(obj); 后mdb文件就关了
      

  10.   

    to: (周药师)
      你的方法我试了,好像没有左右,跟没有一样。。句柄还在涨~ 你用Windows XP的任务管理器调出句柄数看下,每次都在涨
    to: (cxb2011)
      你的方法是怎么搞的?  我这里就是没有ADO的HANDLE呀?  根本就没有呀??
    to: (拈花一笑)
      兄弟的方法我已经做过了,关键就是FREE掉了,但是句柄还在,而且每执行一次就涨 2 个。兄弟们只有在程序创建时创建ADO,在程序执行中,不FREE掉ADO,句柄就不涨了,但是好像内存没有得到良好的释放,兄弟们在帮忙看看,这每查询一次,用ADO.Close 释放不了内存吗?  不FREE掉的前提 怎么释放内存呀??
      

  11.   

    我连firebird的话,句柄是能够正常释放的
      

  12.   

    我这就是一长期不断运行的软件,像考勤类似的软件,只不过我这365*24 工作状态,并且查询频率比较高,所以这个句柄很关键,我现在是在程序创建的时候创建TADOQuery,在使用时不FREE掉,只对SQL和数据集操作,每次SQL.Text :='*******';然后 Open,操作完Close; 但是就是感觉好像内存释放的不是很好,好像内存又有点增量……  挺郁闷的。句柄、内存……  NND 它俩就不能老实听话些呀! 
    EG:private
      ADO1: TADOQuery;
    //……
    peocedure TForm1.Create(Sender: TObject);
    begin
      ADO1 := TADOQuery.Create(nil);
      ADO1.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Password= pass;Persist Security Info=True;User ID= DBName;Data Source= DS';
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      try
        try
          ADO1.SQL.Text := 'select * from dbtbl where id = '''+Trim(Edit1.Text)+'''';
          ADO1.Open;
          if ADO1.RecordCount > 0 then
          begin
            Memo1.Lines.Add(ADO1.FieldByName('name').AsString);
          end;
        finally
          //ADO1.RecordSet.close;  //怎么感觉好像没有什么用,就第一次释放的时候还可以,后边的都不行
          ADO1.Close;
          ADO1.SQL.Clear;
        end;
      except
        Application.MessageBox('查询错误','错误提示',mb_ok);
      end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ADO1.Free;
    end;这样句柄是不涨了,但是好像内存有点增量~  兄弟们还有什么高招没有?  或是还有什么东西可以释放呀??
    能释放的都释放掉它,给它的内存洗的干干净净最好,呵呵~~
      

  13.   

    try
       ...
      MyAdo.Open;
      ...
      MyAdo.Close;
    finally
      MyAdo.Free;
      MyAdo := nil;
    end;
      

  14.   

    问题解决, 在查询时不创建和销毁, 在程序创建时创建,程序关闭时销毁,循环中释放所有ADO数据集等
    测试N久 内存、句柄都不涨了!
    结帖了!