ADO連線資料庫的問題 |
缺席
|
yuhboy
一般會員 發表:12 回覆:27 積分:12 註冊:2004-11-01 發送簡訊給我 |
最近在寫 delphi 一直有個疑問
我使用 ADOConnection ADODataset 或 ADOConnection ADOQuery 在查詢時常發生個現象 程式第一次執行時在查詢時會跑很久,最後就出現查詢逾時的訊息 但同樣的條件 第二次再點查詢時,感覺查詢的速度變快了,也不會出現逾時的問題了 都在相同的條件下,為何第一次都會出現象逾時呢 有無方法可以克服此一問題呢 要請各位大大解惑囉 謝謝 編輯記錄
taishyang 重新編輯於 2007-07-06 15:02:57, 註解 將文章分類成[問題]‧
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
|
yuhboy
一般會員 發表:12 回覆:27 積分:12 註冊:2004-11-01 發送簡訊給我 |
===================引 用 Stallion 文 章=================== 只有你自己知道你的Database Table裡面有多少欄位,以及各個欄位的型態是何種?欄位愈多且其型態愈複雜(如Image之類等等)則所傳回的資料集要花費愈多的時間! A:精簡我當然了解,但所需的欄位就那麼多,我也沒辨法 因此,SQL敘述式除了僅Select所要操作的欄位也要學習寫的精簡有效率,不要偷懶只打星號(*),那麼效率會很差!另外,第二次查詢之所以加快的原因,,個人認為是因為第一次的資料集在Local Client已經有了Cache所以速度才會快. A:如果是Cache的問題,能否在程式一開始執行時,就讓程式有預先做好準備的方法嗎,或許比較佔記憶體也沒關係 |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
HireMan
一般會員 發表:0 回覆:12 積分:2 註冊:2004-12-02 發送簡訊給我 |
1、第一次慢,第二次开始会好些,是否可能是由于第一次时你的adoconnection还未与资料库连接,所以第一次他要跑资料库连接,
2、第二个问题当取数,最后数据集先与数据敏感控件脱离,等取完数据后再连接上,这也会有效率偏差。 === 分享快乐:www.delphichm.com |
yuhboy
一般會員 發表:12 回覆:27 積分:12 註冊:2004-11-01 發送簡訊給我 |
謝謝這位 HireMan 大大的回覆
如你所說的問題在於建立 adoconnection 的問題 那我有沒有辨法在程式一執行時,便建立好連線... 希望能夠因此增加執行效率 謝謝 ===================引 用 HireMan 文 章=================== 1、第一次慢,第二次开始会好些,是否可能是由于第一次时你的adoconnection还未与资料库连接,所以第一次他要跑资料库连接, 2、第二个问题当取数,最后数据集先与数据敏感控件脱离,等取完数据后再连接上,这也会有效率偏差。 === 分享快乐:www.delphichm.com |
HireMan
一般會員 發表:0 回覆:12 積分:2 註冊:2004-12-02 發送簡訊給我 |
连接资料库可以放在应用程序执行时连接,之后不要CLOSE这个Session,对后期的Dataset要连接的取数的话可以直接使用连接,便可连接上去。还有一点你可以改用recordset来处理?
==== 回过头来想问你一个问题,你在取数慢慢要多少时间?取多少笔资料。(看是否可帮上:)) === 分享快乐:www.delphichm.com |
yuhboy
一般會員 發表:12 回覆:27 積分:12 註冊:2004-11-01 發送簡訊給我 |
其實問題並不在筆數的問題
因為筆數都相同 我的習慣大概是如此 procedure button1_Click 動作按下去後 adoquery1.close; adoquery1.sql.clear; adoquery1.sql.add(SQL語法); adoquery1.open; 但是這樣子的做法 會出現第一次click 要等很久 當第一次跑完後,再點第二次時 明顯不用等那麼久了 有時按第一次會等到出現逾時的問題 之後再重新再按一次,就跑得出資料了 你們不覺得這樣子很怪嗎 之前我在用 vb 6 寫程式時,也不會有這樣的問題 我懷疑是 delphi 中 ADO元件的問題 我是用 delphi 2006 資料庫是放在區網中別台主機上,而不是 local 端 希望這樣子的陳述,有助於大家了解我的問題點 |
Louis_H
一般會員 發表:7 回覆:19 積分:10 註冊:2005-10-07 發送簡訊給我 |
procedure button1_Click 動作按下去後
adoquery1.close; adoquery1.sql.clear; adoquery1.sql.add(SQL語法); adoquery1.open; 您好!我也是有遇過您這樣的問題,後來其實有作下列幾點修正,給您參考: 1. SQL 語法 再仔細調整一番,以達最佳化效率目的,比如少用Select * 而用 Select Fieldname 及 From table 如果有 Join 最好按照實際 Table record 由 大 到 小 排列. 2.上述程序碼在 adoquery1.open 前,我是會再加一段 if (Not adoquery1.Prepared) then adoquery1.Prepared; 以上,希望對您有所幫助. |
wuabc
初階會員 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
|
yuhboy
一般會員 發表:12 回覆:27 積分:12 註冊:2004-11-01 發送簡訊給我 |
第一
TADOQuery 這個元件也有 TimeOut 的屬性,OK 第二 若 delphi 必需第一次慢,第二次之後才快 我覺得不合理 難道我給使用者的程式,要先跟他們說,第一次程式一定會當掉 再重開程式再跑一次就會正常了 我應該會被炒魷魚吧 我是希望能找到克服的方法,而不是要知道這是正常的狀況 這樣子的話 那我乾脆放棄 delphi 改用 vs 2005 好了 至少我試過不會有類似的問題 ===================引 用 wuabc 文 章=================== 第一次慢,第二次以後快,應是正常狀況, 此與Delphi或VB應該無關, 至於Timeout問題, Delphi的TADOQuery是為了向下相容而設, Timeout的時間預設應是30秒,無法改變, TADODataset才是建議使用的元件可以改變 Property CommandTimeout (不確定名稱是否正確) 來改變Timeout, 預設好像也是30秒 |
wuabc
初階會員 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
|
agogorz
初階會員 發表:9 回覆:34 積分:28 註冊:2005-04-09 發送簡訊給我 |
SQL不清楚,ORACLE要查到30秒以上大概是資料量以百萬筆計算了,
如果是MYSQL的話就有可能正常資料而TIME OUT。 你提到可否先CACHE下來,我是認為,正常的情況都是要Query資料的, 很難想像vs2005可以而delphi會過久,因為基本上資料庫的查詢是不會差多少的, 若真的需要幫助,請提供你的資料庫型態及大小,以下兩篇供參考,亦可自行搜尋ado 查詢 http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=43234 http://delphi.ktop.com.tw/board.php?cid=30&fid=68&tid=53964 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |