線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2231
推到 Plurk!
推到 Facebook!

ADOQuery 搭配迴圈的問題

答題得分者是:sryang
yuhboy
一般會員


發表:12
回覆:27
積分:12
註冊:2004-11-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-20 11:43:29 IP:140.116.xxx.xxx 訂閱
我有個需求
就是用迴圈, run 二十次
但在這二十次中都要做 adoquery的查詢

for n := 1 to 20 do
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add(SQL語法);
adoquery1.open;
end;

為什麼這樣子做的效率會很差呢

如果這樣子的需求時

我必需怎麼樣寫

才會像 vb 在操作 recordset 時那麼快呢

請幫幫我....拜託


kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-20 17:22:38 IP:59.127.xxx.xxx 訂閱
你在vb中操作recordset也是一樣,下20次SQL嗎?
------
Kadee/BigRed Ent.
www.tw165.com
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-20 21:36:56 IP:61.67.xxx.xxx 未訂閱
資訊不足,以現有資訊這是唯一能處理的方法,效能當然差,但sql也有一次性很複雜的做法,可以利用次查詢
select * from xxxxx where bbbb=(select .....)等方式
1.不清楚你20次的query目的及所要的結果為何?
2.這20次的query(沒看到你20次sql內容)有沒有共通性
所以無法分析
要不你用20個query來做(SQL先設定好), 因為QUERY是將 SQL送交主機運算再回傳到LOCAL端,所以不斷改變SQL語法,不僅造成主機負荷過重,也會造成WINDOWS MEMEORY LEAK的問題更嚴重(尤其是XP)
yuhboy
一般會員


發表:12
回覆:27
積分:12
註冊:2004-11-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-20 22:13:06 IP:61.225.xxx.xxx 訂閱
我也曉得樓上二位的說法

但是,這二十次是必要的
例如:
有一個陣列
a[0] := 323;
a[1] := 322;
...
a[19] := 829;

for n := 0 to high(a) do
begin
adoquery1.sql.clear;
adoquery1.close;
adoquery1.sql.add('select * from 通訊錄 where id=''' a[n] ''' ');
adoquery1.open;

寫入到不同的 Excel 工作表(程式略)
end;

陣列中 a 的值是固定20項

像這樣子的東西,有比較好的方法嗎?
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-20 23:41:42 IP:203.204.xxx.xxx 訂閱
直接串成WHERE Id in (xx,xxx,xx...)應該可以快許多吧
yuhboy
一般會員


發表:12
回覆:27
積分:12
註冊:2004-11-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-20 23:49:18 IP:61.225.xxx.xxx 訂閱
這方法
當然我也想過
要是可行我就不用苦惱了

我若 WHERE IN (XXX,XXX,XX)
那我怎麼知道,哪筆是要寫到
Excel sheet1 哪筆是要寫到 sheet2
陣列中每一個 a[n] 就代表著一個SQL 查詢的條件
若如上面的做法,Excel sheet1 就無法分辯那個是那個了...


===================引 用 wuabc 文 章===================
直接串成WHERE Id in (xx,xxx,xx...)應該可以快許多吧
bighm
一般會員


發表:5
回覆:21
積分:15
註冊:2006-10-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-20 23:52:01 IP:203.70.xxx.xxx 未訂閱
考不考慮一次全抓出來,

再用 filter 來篩選
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-10-20 23:54:40 IP:203.204.xxx.xxx 訂閱
那你繼續加油了
sryang
尊榮會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-10-21 00:20:31 IP:124.10.xxx.xxx 訂閱
善用參數

[code delphi]
ADOQuery1.Close;
ADOQuery1.sql.clear;
ADOQuery1.sql.add('select * from 通訊錄 where id=:id');
with ADOQuery1.Parameters.AddParameter do
begin
Name := 'id';
DataType := ftString;
Size := 10;
end;
for n := 0 to high(a) do
begin
ADOQuery1.Parameters.ParamValues['id'] := a[n];
ADOQuery1.Open;
// 做你要做的事
ADOQuery1.Close;
end;
[/code]
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-10-21 20:24:48 IP:211.78.xxx.xxx 訂閱

===================引 用 yuhboy 文 章===================
我有個需求
就是用迴圈, run 二十次
但在這二十次中都要做 adoquery的查詢

for n := 1 to 20 do
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add(SQL語法);
adoquery1.open;
end;

為什麼這樣子做的效率會很差呢

如果這樣子的需求時

我必需怎麼樣寫

才會像 vb 在操作 recordset 時那麼快呢

請幫幫我....拜託

你可用一 SQL 即可

adoquery1.close;
adoquery1.sql.clear;
for n := 1 to 20 do
begin
adoquery1.sql.add('SELECT ' IntToStr(n) ',* FROM 通訊錄 where id = ' QuotedStr(a[n]));
if n <> 20 then adoquery1.sql.add('UNION');
end;
adoquery1.open;

也就是
SELECT 1,* FROM 通訊錄 where id = a[1]
UNION
SELECT 2,* FROM 通訊錄 where id = a[2]
UNION
SELECT 3,* FROM 通訊錄 where id = a[3]
...
UNION
SELECT 20,* FROM 通訊錄 where id = a[20]
這樣就可一次把資料全選出來,並可借用第一欄位的值判斷是哪一參數的資料了


編輯記錄
懷舊的人 重新編輯於 2007-10-21 20:32:28, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-10-22 21:39:46 IP:61.67.xxx.xxx 未訂閱
如果你早這樣問,事情就簡單多了
a[0] := 323;
a[1] := 322;
...
a[19] := 829;

adoquery1.sql.clear;
adoquery1.close;
adoquery1.sql.add('select * from 通訊錄 where id= :id ');

for n := 0 to high(a) do
begin
adoquery1.close;
adoquery1.parambyname('id').value:= a[n];
adoquery1.open;

寫入到不同的 Excel 工作表(程式略)
end;

ps:po上後才發現原來樓上已經有相同的做法了
===================引 用 yuhboy 文 章===================
我也曉得樓上二位的說法

但是,這二十次是必要的
例如:
有一個陣列
a[0] := 323;
a[1] := 322;
...
a[19] := 829;

for n := 0 to high(a) do
begin
adoquery1.sql.clear;
adoquery1.close;
adoquery1.sql.add('select * from 通訊錄 where id=''' a[n] ''' ');
adoquery1.open;

寫入到不同的 Excel 工作表(程式略)
end;

陣列中 a 的值是固定20項

像這樣子的東西,有比較好的方法嗎?
編輯記錄
P.D. 重新編輯於 2007-10-22 21:40:42, 註解 無‧
系統時間:2024-05-17 10:28:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!