新建一个窗体程式
 拖进三个控件
 Timer1  //设定两秒执行一次
 SqlQuery1->SqlConnection1
BUG 1......const sqlstr = 'select 商品代码 from 商品档案 where id=1';
事件
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:Integer;
begin
  with ADOQuery1 do
  begin
    Close;
    Sql.Clear;
    Sql.Add(sqlstr);
    //Open;  //这没问题
    I:=ExecSql();  //问题来了,每次漏一点内存,
  end;
end;
BUG 2......const sqlstr = 'select 商品代码 from 商品档案 where id=1';
事件
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:Integer;
begin
  SqlConnection1.Open;
  with ADOQuery1 do
  begin
     .......
  end;
  SqlConnection.Close;    //这段代码会无法Free掉Open时创建的N个线程,程序的线程数会爆增一直不停
end;
BUG 3......const sqlstr = 'select 商品代码 from 商品档案 where id=1';
事件
procedure TForm1.Timer1Timer(Sender: TObject);
var
  aTran:TDBXTransaction;
begin
  
  aTran:=SqlConnection1.BeginTransaction  //这里有时会根本不起动事务,aTran极有可能=nil
  with ADOQuery1 do
  begin
     .......
  end;
  SqlConnection1.CommitFreeAndNil(aTran);   end;//////////////////////////////////////////////////////////////////////////////////
以上测试环境  D2007 D2009 Sybase Ase 12.5

解决方案 »

  1.   

    都是定时不断查询吗;数据库的连接
    SqlConnection1.Open;及close放在过程外面,只要一次连接就行了。
    过程里面只要关闭查询返回的数据结果集
      

  2.   

    难道这种问题都没人关注吗???
    ADO的我测试过不会这样
      

  3.   

    我來回答,大家看看是不是這理
    1、事務問題,上個事務還沒執行完
    2、應該先把相關聯的其它控件關了如,SQLQUERY之類的,再關SQLCONNECTION
    3、創建事務的方法不對,應先判斷一下事務的狀態後再創建。
      

  4.   

    决放弃SYBASE 和 DBEXPRESS 了
      

  5.   

    是楼主自己没有写好!
    不要怪DBEXPRESS!
      

  6.   

    呵呵,有这样写程序的。你所谓的BUG1,明明是'select 商品代码 from 商品档案 where id=1'
    只能打开获取,ExecSql是执行更新语句时用的。不一一点评了,楼主写程序,首先思路还没有弄清楚啊。