ADOQuery 搭配迴圈的問題 |
答題得分者是:sryang
|
yuhboy
一般會員 發表:12 回覆:27 積分:12 註冊:2004-11-01 發送簡訊給我 |
|
kadee
高階會員 發表:11 回覆:141 積分:165 註冊:2002-03-20 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
資訊不足,以現有資訊這是唯一能處理的方法,效能當然差,但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 發送簡訊給我 |
我也曉得樓上二位的說法
但是,這二十次是必要的 例如: 有一個陣列 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 發送簡訊給我 |
|
yuhboy
一般會員 發表:12 回覆:27 積分:12 註冊:2004-11-01 發送簡訊給我 |
|
bighm
一般會員 發表:5 回覆:21 積分:15 註冊:2006-10-29 發送簡訊給我 |
|
wuabc
初階會員 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
善用參數
[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 發送簡訊給我 |
===================引 用 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 發送簡訊給我 |
如果你早這樣問,事情就簡單多了
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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |