如何提高BDE操作TABLE的速度? |
答題得分者是:Justmade
|
viery
一般會員 發表:19 回覆:11 積分:6 註冊:2002-09-16 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
即使你不 post 到下一個 insert 時也會自動 post 的啊
Post 是針對單一記錄的,不可能在不 post/cancel 的情況下進到另一記錄的。 另在不斷的insert裡,Next; 是完全沒需要的。 你的Table1 是否有連結到 DataSources 再連到感知元件呢(尤其是 DBGrid),若是的話 Table1.DisableControls
For...
begin
...
...
end
Table1.EnableControls 會有幫助。
另若 Table1 有很多 Detail table 時,亦可先除掉這些關係 insert 後再加回。 由於你的資料不是很充足所以很難給更多建議,你可以 post 多一點相關資料。
|
viery
一般會員 發表:19 回覆:11 積分:6 註冊:2002-09-16 發送簡訊給我 |
CHIH,
如每次APPEND会自动POST,所以这样设定没有用;
T.J.B,
想问一下,直接用SQL的方法怎么处理? 不用BDE的QUERY组件? 能简单说明一下吗? JustMade,你的办法很不错.我现在已经可以很快取到数据.但想问一下还可以优化吗? 首先我说一下现在我的用法.
query1,table1,table1通过datasource1连接到dbGrid1上 1, 首先我用query1查询得到数据;
2,
table1.open;
table1.DisableControls;
while not query1.eof do
begin
table1.append;
table1.fieldByName('field1').AsString := query1.fieldByName('field1').AsString;
......
table1.post;
query1.next;
end;
table1.EnableControls;
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
var j:integer; table1.open;
table1.DisableControls;
while not query1.eof do
begin
table1.append;
table1.fieldByName('field1').AsString := query1.fieldByName('field1').AsString;
......
if j MOD 500=0 then //加上這句還是有效...你可以試看看..
table1.post;
query1.next;
j:=j 1;
end;
table1.EnableControls;
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
更好的方法就是使用 sql Table1.Active := false;
Query1.SQL.Text := 'insert into table1 select * from table2'
Query1.Execute;
Table1.Active := true;
就將所有Table2 的資料加入到 Table1 了。
當然 select * from table2 應換成你 Query1 的 SQL
若你兩個 Table 的格式是不一樣的,也可以用 insert into table1 (ItemNumber,ItemName,Price) select ItemNumber, ItemName, Price from table2 where Price > 10 等等。
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
直接用SQL的方法怎么处理 ==>就是用SQL的INSERT INTO 語法ㄚ
不用BDE的QUERY组件==> 要 用兩個query來做
第2個query就是代替你原先的table元件
query2.DisableControls; query2.first; while not query2.eof do begin query1.close; query1.SQL.clear; query1.SQL.add(' insert into aaa(empno,ename,eaddress,empphone) '); query1.SQL.Add(' VALUES (''' query2.fieldbyname('empno').asstring ''',' ) ; query1.SQL.Add(' ''' query2.fieldbyname('empname').asstring ''',' ) ; query1.SQL.Add(' ''' query2.fieldbyname('eaddress').asstring ''',' ) ; query1.SQL.Add(' ''' query2.fieldbyname('empphone').asstring ''')' ) ; query1.ExecSQL ; query2.next; end; query2.close; <== query2.open; <== (此兩行一定要加 不然你會看不到insert進來的資料) query2.EnableControls;ps: aaa 就是你原先table要append進去的tablename (是資料庫的tablename 不是你table元件的tablename) 天行健 君子當自強不息~~@.@
------
天行健 君子當自強不息~~@.@ |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
TJB 版主....對 Paradox / dBase 來說,我肯定你這方法比 insert / post 慢一倍以上,在DBMS也應比 insert / post 慢,因為
1. 每次改變 SQL.Text Query 元件都會做一次句法檢查,所以你 Add 5 次就做 5 次囉。
2. 每次執行是因為句法不同,每次都重新 allocate resources 去執行,很浪費。 若用 Params 可解決上述兩點。 更好的是將所有的記錄合成一句 update SQL 最後一次過執行就會更快了。可參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27177。 不過,始終應是
'insert into table1 select * from table2'
最快罷?
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |