各位,請問有沒有遇到adoQuery.SQL.Open執行時間太長的問題。詳情:
1. 數據庫informix
2. Connection已經設定了CommandTimeOut時間不超過20秒
3. SQL語句用其他工具(WinSQL)執行不超過1秒鐘,但是在Delphi 7 下用adoQuery.SQL.Open 打開需要幾分鍾時間。而且CommandTimeOut失效
4. 請問如何解決?

解决方案 »

  1.   

    重来没有想你说的ADOQUERY.SQL.OPEN,一般我就是ADOQUERY.OPEN就可以了不知道你是不是写错了
      

  2.   

    那是你的SQL语句的问题,你是数据量大不大,SQL语句是否合理
      

  3.   

    数据量不大,10條記錄而已。用ADOConnection.Execute(...)也可以很快執行。我的同事告訴我,以前它也遇到類似問題。所以改用了BDE。但是,我不太喜歡一個地方用ADO,另外一些地方用BDE。謝謝
      

  4.   

    是不是ADO对你的数据库支持不好啊,也说不定,没用过infomix
      

  5.   

    不至于啊,照例说bde没有ado连接速度快啊。 呵呵
      

  6.   

    直接用:ADOquery.open 我没见过谁写: adoquery.sql.open的。肯定是你写的语句出问题了,ado的执行速度应该比bde快的多。
      

  7.   

    我也相信ado比dbe快,但我也相信ado的连接速度很慢!!
      

  8.   

    重来没有想你说的ADOQUERY.SQL.OPEN,一般我就是ADOQUERY.OPEN就可以了不知道你是不是写错了
     
      重来没有想你说的ADOQUERY.SQL.OPEN,一般我就是ADOQUERY.OPEN就可以了不知道你是不是写错了
     
      

  9.   

    在使用ado 的时候要小心,避免一次取大量的数据
      

  10.   

    問題解決了,寫出來給大家分享:詳情:
    1. 數據庫informix
    2. Connection已經設定了CommandTimeOut時間不超過20秒
    3. SQL語句用其他工具(WinSQL)執行不超過1秒鐘,但是在Delphi 7 下用adoQuery.Open(之前係筆誤) 打開需要幾分鍾時間。而且CommandTimeOut失效解決過程:
    1. 我看到論壇上沒有什麽好的建議,於是我只好自己解決。首先我懷疑自己的程式造成系統内存問題(Delphi有Bug),於是我退出Delphi重新開機。
    2. 打開win的工作管理員,檢測内存使用狀況。重新進入Delphi後,程式基本能運行,但是SQL執行的速度越來越慢。直到完全不動了(我寫的是Down BOM的程序,所以在遞歸中會不斷執行一些SQL)。此間,系統使用的内存的確不斷增長。
    3. 聯想到我的程式中所有變量均沒有釋放内存,於是我修改了程式,加入了釋放語句。
    4. 再次運行程式。出乎意料,第一個SQL語句處就已經停下來。我開始懷疑Delphi IDE對内存的管理。
    5. 重新開機,再次運行。結果系統可以運行,但是效率仍然越來越低。但這次内存沒有增長。
    6. 我考慮用其他的ADO類來實現功能,但是我發現其他類要不返回結果集的機制和ADOQuery一致,要不就不返回結果集。
    7. 考慮到之前我試用ADOQuery.Open不能執行的情況下,ADOConnection.Execute可以執行,但是我當時沒有注意到ADOConnection.Execute有一個Overload的Funtion。
    8. 我放棄了。
      

  11.   

    續...9. 我想了很多,最多的是 完了!完了!完了!
    10.但是...
    11.我吃飯時想,ADO是ActiveX導入到Delphi中來的,理論上MS ADO有的方法,Delphi也應該有。於是我回來右試了試。
    12.發現了ADOConnection.Execute可以返回RecordSet。
    13....
    14 我試了試,速度像飛一樣。var
      Query     : TADOQuery;
      RecordSet : _RecordSet;
      Connection: TADOConnection;begin
      //初始化Connection
      Connection:=TADOConnection.Create;
      Connection.ConnectionString:='...';
      ...  //用Connection.Execute執行SQL並返回結果集
      RecordSet:=Connection.Execute('Select ...');
      
      //將RecordSet賦值給Query.RecordSet
      //Query不用初始化,再次賦值時也不用做任何操作
      Query.RecordSet:=RecordSet;
      if not Query.Eof then
        ...謝謝大家幫忙!
      

  12.   

    更正://Query不用初始化,再次賦值時也不用做任何操作改為:
    //Query不用設置Connection,再次賦值時也不用做任何操作RecordSet:=Connection.Execute('Select ...');
    Query:=TADOQuery.Create(nil);
    Query.RecordSet:=RecordSet;
    if not Query.Eof then
      ...;
      

  13.   

    我是用SQL SERVER,也有速度慢的问题,所以
    收藏&&学习
      

  14.   

    1.可能你的系统有问题
    2.你的SQL语句可能有问题
    3.你的数据表是否有主键或索引,也会提高速度的
    4.你系统中的MDAC是支持ADO的数据感应软件,是不是有错误或版本低。下载个高版本的试试吧。
      

  15.   

    我是用SQL SERVER,也有速度慢的问题,所以
    收藏&&学习
      

  16.   

    从你的解决过程来看,是你的adoquery设置有问题,不过也有点纳闷,要是真的只有十条记录再怎么有问题也不会这么夸张吧
      

  17.   

    我用SQL Server、Orcale都沒問題,但是Informix就是怪。
    好了,這裡寫出來,只當是朋友們遇到問題時,做個參考。再次謝謝大家
    請板主結貼
      

  18.   

    李维的<ado ,mts,com+ >的那本书中对ado的效率有很详细的论述,建议大家看看。
    速度慢可能还可cursor location有关吧。李惟说ado 2.5的存贮速度也就比bde慢5% 左右。然而bde现在处于维护阶段,而ado还在不断发展,以后将会更加普及吧。
      

  19.   

    ADO不好,有时候还不如ODBC来的快。我现在就用ODAC