全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2324
推到 Plurk!
推到 Facebook!

TADOQuery新增一筆record,速度有點慢

答題得分者是:jcjroc
mtyen
一般會員


發表:13
回覆:16
積分:5
註冊:2004-02-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-26 16:54:32 IP:210.59.xxx.xxx 未訂閱
各位大大: 我有兩個Table,為master/Detail的relation,我用TADOQuery新增280筆record, 卻要花費28秒,有點慢,請問大家有沒有甚麼方法可改善速度.我有用過top_id= 52515 的方法,ADOQuery->DisableControls但好像沒用,改用TADOCommand,也沒 用,不知還有沒有甚麼方法? (一定要用ADO的元件.)
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-26 19:28:43 IP:221.169.xxx.xxx 未訂閱
引言: 各位大大: 我有兩個Table,為master/Detail的relation,我用TADOQuery新增280筆record, 卻要花費28秒,有點慢,請問大家有沒有甚麼方法可改善速度.我有用過top_id= 52515 的方法,ADOQuery->DisableControls但好像沒用,改用TADOCommand,也沒 用,不知還有沒有甚麼方法? (一定要用ADO的元件.)
mtyen:你方便Post你如何執行新增的程式片斷!? Andy Chang
------
Andy Chang
mtyen
一般會員


發表:13
回覆:16
積分:5
註冊:2004-02-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-27 10:06:56 IP:210.59.xxx.xxx 未訂閱
void __fastcall TForm1::WriteToPartDB(char *kind, char *product, char *rev, char *item, char *parts, char *quant, char *ref) { AnsiString str; AnsiString sCmd; static char Item2[MAXTOKEN]; static char Part2[MAXTOKEN]; static char Quant2[MAXTOKEN]; if (strcmp(kind, "") != 0 && strcmp(product, "") != 0 && strcmp (rev, "") != 0 ) { if (item[0] != '\0' && parts[0] != '\0' && quant[0] != '\0') { strcpy(Item2, item); strcpy(Part2, parts); strcpy(Quant2, quant); DataModule1->ADOQuery3->Close(); DataModule1->ADOQuery3->SQL->Clear(); sCmd=""; sCmd.sprintf("insert into rubypart (HKIND, HPRODUCT, REV, ITEM, PART, QTY) " "values ('%s', '%s', '%s', '%s', '%s', '%s')", kind, product, rev, item, parts, quant); DataModule1->ADOQuery3->SQL->Add(sCmd); DataModule1->ADOQuery3->ExecSQL(); } DataModule1->ADOQuery3->Close(); DataModule1->ADOQuery3->SQL->Clear(); sCmd=""; sCmd.sprintf("insert into rubyref (HKIND, HPRODUCT, REV, PART, REF) " "values ('%s', '%s', '%s', '%s', '%s')", kind, product, rev, Part2, ref); DataModule1->ADOQuery3->SQL->Add(sCmd); DataModule1->ADOQuery3->ExecSQL(); } } 程式片段如上,copy/paste不是很整齊,不知如何插入檔案? 寫入資料庫主要是此function,時間都花在此function上, 我是用Paradox的DataBase,在此function前,有call DataModule1->ADOQuery3->DisableControls()
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-27 14:14:55 IP:211.75.xxx.xxx 未訂閱
1.你使用ADO的方式是直接呼叫DB提供的Drive,或是再透過ODBCㄋ 2.BCB對ADO做了一番的包裝,包括SQL Command的重組等等,當然會比使用陽春的ADO介面多花一些時間. 3.ADO是ActiveX的介面,本來在效率上就差了許多,這點在許多文章上都有提到(而且常強烈的建議在要求高效率的程式上,不要用)
mtyen
一般會員


發表:13
回覆:16
積分:5
註冊:2004-02-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-27 18:29:24 IP:210.59.xxx.xxx 未訂閱
jcjroc: 我使用ADO的方式是直接呼叫DB提供的Drive,不過,我將資料庫由Paradox改為 Access,就快了好幾倍,因此我建議要用ADO元件寫程式的工程師,如果是檔案 型的資料庫最好用Access
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-27 18:40:48 IP:211.75.xxx.xxx 未訂閱
如果可以換DB,那我就會強烈建議使用MSDE ㄏㄏㄏ,簡化版的MSSQL,目前已知除全文檢索與連線數及控制介面(UI)外. 其他重要了功能都具備,最最重要的是他是免錢的.... 當然程式人員也必須將其發揮的透徹,才能在效能上得到很好的表現....
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-28 01:32:12 IP:221.169.xxx.xxx 未訂閱
mtyen:該給jcjroc大大鼓勵鼓勵吧! Andy Chang
------
Andy Chang
mtyen
一般會員


發表:13
回覆:16
積分:5
註冊:2004-02-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-28 18:53:00 IP:210.59.xxx.xxx 未訂閱
jcjroc: 請問MSDE在哪可download,你告訴我哪可拿的到, 此題分數歸你了,快點.
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-28 23:28:55 IP:61.219.xxx.xxx 未訂閱
哇勒!!!! MSDE2000可以到微軟直接Download 還有我不是來賺分數的 你可以發現幾乎我的回答大都只是給個方向而已. 因為我永遠支持一個"要被番仔殺一次"的觀念,所以就算我已有實做的程式碼,我也不會全部Post上來. 真正的實做還是要靠個人.
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-30 00:45:52 IP:219.81.xxx.xxx 未訂閱
引言: 如果可以換DB,那我就會強烈建議使用MSDE ㄏㄏㄏ,簡化版的MSSQL,目前已知除全文檢索與連線數及控制介面(UI)外. 其他重要了功能都具備,最最重要的是他是免錢的.... 當然程式人員也必須將其發揮的透徹,才能在效能上得到很好的表現....
強烈建議使用 MSDE,雖然本身沒有 GUI 管理工具,但是可以用有安裝SQL Server 的電腦,使用 Enterprise Manager 連進去管理 只是在安裝 MSDE 時,要下參數指定要開啟網路連線功能以及要設定sa帳號的密碼 請參考:http://www.microsoft.com/sql/msde/default.mspx 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
accepter
一般會員


發表:15
回覆:10
積分:5
註冊:2005-05-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-31 08:18:04 IP:140.109.xxx.xxx 未訂閱
不好意思插花問一個有關TADOQuery的問題 SQL語法寫在TADOQuery元件的TString中和寫在程式碼中 執行起來會不會有什麼差別呢?
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-31 16:13:31 IP:61.219.xxx.xxx 未訂閱
不懂你的意思 不過我一般來說,為考慮程式的活用性,我會建議將SQL Command寫在文字檔中 然後利用TStringList讀入再執行. 當然在許多場合之中會導致參數數目與型態等不符合的困擾, 最好的就是自己寫一個解譯類似Scrpit的程式,而此腳本語言的格式就自訂. 讀入此腳本後再將其對應的SQL Command與填入參數等動作. 當然還有一個更方便的方式,那就使用有預存程序功能的DB.那可以讓你的程式達到一樣的靈活性(當然此種方式將不允許你的程式使用不支援預存程序的DB). 其實際的運用方式如果是利用腳本,那牽涉的層面就大了.而另一種相對的非常簡單. 如果你問的是說SQL Command寫死在程式中與寫入String哪個效率高???? 那當然是少了New Class動作的寫死方式快(但快得了多少???) 整個DB操作最耗時的不在這個環節,你應該分的清楚. 如果你是問說SQL Command被VCL重組的事,你可以去追蹤依下VCL,你就知道他怎樣重組,(不過就單以這事來說,我不覺VCL有任何不當的處理,但相對的,其他方面就見仁見智了,我就有發現一個BUG,唉!!!!). 我想這問題就此打住了,如果要討論資料庫程式的執行效率與靈活性的議題,再開一個新的且符合的討論議題會比較好,而且回答的人會比較多.
系統時間:2024-04-26 1:09:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!