各位,請問有沒有遇到adoQuery.SQL.Open執行時間太長的問題。詳情:
1. 數據庫informix
2. Connection已經設定了CommandTimeOut時間不超過20秒
3. SQL語句用其他工具(WinSQL)執行不超過1秒鐘,但是在Delphi 7 下用adoQuery.SQL.Open 打開需要幾分鍾時間。而且CommandTimeOut失效
4. 請問如何解決?
1. 數據庫informix
2. Connection已經設定了CommandTimeOut時間不超過20秒
3. SQL語句用其他工具(WinSQL)執行不超過1秒鐘,但是在Delphi 7 下用adoQuery.SQL.Open 打開需要幾分鍾時間。而且CommandTimeOut失效
4. 請問如何解決?
重来没有想你说的ADOQUERY.SQL.OPEN,一般我就是ADOQUERY.OPEN就可以了不知道你是不是写错了
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. 我放棄了。
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
...謝謝大家幫忙!
//Query不用設置Connection,再次賦值時也不用做任何操作RecordSet:=Connection.Execute('Select ...');
Query:=TADOQuery.Create(nil);
Query.RecordSet:=RecordSet;
if not Query.Eof then
...;
收藏&&学习
2.你的SQL语句可能有问题
3.你的数据表是否有主键或索引,也会提高速度的
4.你系统中的MDAC是支持ADO的数据感应软件,是不是有错误或版本低。下载个高版本的试试吧。
收藏&&学习
好了,這裡寫出來,只當是朋友們遇到問題時,做個參考。再次謝謝大家
請板主結貼
速度慢可能还可cursor location有关吧。李惟说ado 2.5的存贮速度也就比bde慢5% 左右。然而bde现在处于维护阶段,而ado还在不断发展,以后将会更加普及吧。