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

ADOquery.SQL 的指定

答題得分者是:Justmade
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-01 12:04:54 IP:61.66.xxx.xxx 未訂閱
請問各位! 我建置了 DataModule ADOconnection ADOquery, 然後透過 www 的連接到遠端 的M$SQL2000資料庫 而其中因為ADOquery.SQL.text 是帶參數的, 我在 DataModule.Create Event 中有加入 ADOconnection.Connected:= False; ADOconnection.ConnectionString:= '....'; ADOquery.SQL.Text:= 'select * from MyData where No= :iNo'; 若我的InterNet是順暢的, 則程式在run都很正常, 但如果我拔掉網路線, 問題來了 程式在 DataModule Create時, 系統會當在ADOquery.SQL.Text的位置, 後來我 查了程式, 發現如果我變更了 SQL.text時, ADO會自動使CONNECTED為TRUE 而這時我的InterNet並沒有通, 所以就當在這裡直到windows沒有回應(也不會 傳回connection error), 我嘗試過的方法 1.直接把這段sql.text 寫到 ADOquery的 SQL property中, 情況一樣 2.在connect上時才指定 ADOquery.SQL, -->沒有問題, 可以跑, 但每次都要 重丟一次SQL命令到SERVER上, 耗時又耗資源, 不知道還有沒有其他方法可以 解決這個問題 PS:我這段程式, 有的客戶有InterNet, 有的沒有, 所以我不能強制寫在程式中 一定要connect, 所以建置一個按鈕讓user去connection 謝謝!
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-01 13:04:42 IP:61.66.xxx.xxx 未訂閱
引言: 你有沒有用Try Except來處理例外事件ㄋ??
這是一定有的啦! 但問題是, 目前根本不會觸發 exception, try adoquery.sql.text:= '....' 問題就當在這裡, 完全沒有回應 except end;
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-01 13:09:10 IP:211.74.xxx.xxx 未訂閱
如果沒有InterNet的客戶你資料要連接哪裡ㄋ?? 我建議你用二個ADOconnection,一個給有InterNet的用->ADOconnection1,一個給沒有InterNet的用->ADOconnection2,然後用 Try ADOconnection1.Connected:=True; except ADOconnection2.Connected:=True; end; 這樣你是不是就可以判斷客戶有沒有InterNet,然後再決定ADOquery要連接哪一個ADOconnection了ㄋ?? TRY TRY SEE
引言: PS:我這段程式, 有的客戶有InterNet, 有的沒有, 所以我不能強制寫在程式中 一定要connect, 所以建置一個按鈕讓user去connection 謝謝!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-01 13:36:33 IP:218.16.xxx.xxx 未訂閱
我剛看過 TADOQuery / TADOCustomDataSet 有關 SQL / Command Text 的部份,好像沒去自動 Connect 耶? 其中 CheckInactive 都只是那本身是不是 Active 也沒去 Connect... 建議你將 ADODB.PAS 抄到你那個 DataModule Unit 的 folder, 之後就可以進入去 Debug 和設定 break point 了,看看實則是那行出了問題,甚至改改源程式試試。 我自己沒有用 ADO (連 ADO 頁也全都刪了)所以沒去試試。
P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-01 14:15:03 IP:61.66.xxx.xxx 未訂閱
引言: [blue] 如果沒有InterNet的客戶你資料要連接哪裡ㄋ?? 我建議你用二個ADOconnection,一個給有InterNet的用->ADOconnection1,一個給沒有InterNet的用->ADOconnection2,然後用 Try ADOconnection1.Connected:=True; except ADOconnection2.Connected:=True; end;
sorry! 容我解說一下 我這個程式是提供了一個網站的SQL資料給客戶查詢用, 換句話說, 用不用是 客戶的意願, 所有的資料庫來源仍是來自LOCAL , 但我的情況是如果使用者有 架設InterNet而且是通的, 在按下我設置的 connect button之後, 都很正常, 就算無法連上主機端, 程式也會出現 connection error 錯誤, 但如果對方 沒有InterNet而又按下本鍵的話, 就會有上述的狀況發生, 如果我是把 ADOquery.SQL.Text 這段放在 ADOconnection 執行之前的話, 也就是說, 如果 我先下 try ADOconneciton:= True; ADOquery.Close; ADOquery.SQL.Text:= 'select ....'; except showmessage('connection error'); end; 這樣就沒有問題了! 但這樣每次執行時都會丟sql到server上去執行, 很耗時間 及資源, 因此是否有更好的方法及效率來解決!
P.D.
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-01 14:18:37 IP:61.66.xxx.xxx 未訂閱
引言: 我剛看過 TADOQuery / TADOCustomDataSet 有關 SQL / Command Text 的部份,好像沒去自動 Connect 耶? 其中 CheckInactive 都只是那本身是不是 Active 也沒去 Connect... 建議你將 ADODB.PAS 抄到你那個 DataModule Unit 的 folder, 之後就可以進入去 Debug 和設定 break point 了,看看實則是那行出了問題,甚至改改源程式試試。 我自己沒有用 ADO (連 ADO 頁也全都刪了)所以沒去試試。
的確, 在我想來, 變更 SQL內容, 不應該是會有Connect行為, 但我實測的情況 1.先將 ADOconnection 關閉(false) 2.到 ADOquery SQL property 中寫 select ........ 語法, 按確定後 3.回到 ADOconnection元件上看, 竟然變為 True, 也就是已connect上 所以我才會有這樣的疑問, 這是ADO的特性嗎, 還是??? 我使用InterBase似乎沒有這樣的問題呢!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-01 14:31:08 IP:202.39.xxx.xxx 未訂閱
引言: 的確, 在我想來, 變更 SQL內容, 不應該是會有Connect行為, 但我實測的情況 1.先將 ADOconnection 關閉(false) 2.到 ADOquery SQL property 中寫 select ........ 語法, 按確定後 3.回到 ADOconnection元件上看, 竟然變為 True, 也就是已connect上 所以我才會有這樣的疑問, 這是ADO的特性嗎, 還是??? 我使用InterBase似乎沒有這樣的問題呢!
是會這樣子! 在指定或變更 TADOQuery 的 SQL 的內容時 它似乎會去檢查或做一些動作, 可能是編譯 SQL, 檢查 Field, Parameter 之類的 所以它會自動將 Connected 設 True. 既然這樣, 那有辦法在真地要執行 SQL 的動作時 再去指定或變更 SQL 的內容嗎? --- Have you ever wondered what it would be like?
P.D.
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-01 14:47:27 IP:61.66.xxx.xxx 未訂閱
引言: 是會這樣子! 在指定或變更 TADOQuery 的 SQL 的內容時 它似乎會去檢查或做一些動作, 可能是編譯 SQL, 檢查 Field, Parameter 之類的 所以它會自動將 Connected 設 True. 既然這樣, 那有辦法在真地要執行 SQL 的動作時 再去指定或變更 SQL 的內容嗎? --- Have you ever wondered what it would be like?
在還沒有更好的方法解決時, 我目前是這樣子處理的, 但就如我所提到, 因為user不一定會執行多少次, 很可能每建一筆資料就會去查一次, 因為 既然是查詢就很難說了, 不是嗎? 所以這樣的做法每次sql都要連到server, 重置sql內容, 再由server解譯, 如果有1000人次同時上來, 那我不敢想像, 目前我這套系統是至少有5000點會使用, 所以是否更有效率的方法可以解決, 例如我採Interbase是這樣的寫法 在 DataModule.Create中
try
   IBDataBase:=....
   IBquery1.SQL.Text:= 'select ...... where no= :ino order by ....';
except
    ....
end;    在 button地方
  IBQuery1.ParamByName('no').Value:= .....
就樣就好了    
比對一下, 同樣 button, 以 ADOquery時的寫法
try
   ADOconneciton:= True;
   try
      ADOquery.Close;
      ADOquery.SQL.Text:= 'select ...... where no= :ino order by ....';
   except
      ......
   end;
except
   .....
end;    
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-01 15:24:32 IP:218.16.xxx.xxx 未訂閱
我一向都很討厭每次轉變 SQL.text 元件就會驗証一次的做法,這個問題在 ZEOS 5.X 尤其嚴重,我以前也像大多數人一樣用 SQL.Clear / Add / Add / Add... 但當我那次發現將 1個 Clear 4 個Add 變成 SQL.Text := ... 能使我那10萬個 Insert 由 500 多秒變為 100 多秒後,我便一直鼓勵人直接一次過用 SQL.Text := .... 。雖然 BDE / ADO / dbExpress 的差異比 Zeos 小很多,但減少一些無謂的重覆測試亦是好的。 若你不想改源程式這樣大動作,可否加一個 Globel 的 Flag,像是 IE 的離線作業的樣子,若離線作業 = true 就不做這些連線上主機的動作。若使用者想連上主機,要按連接在這些試連上主機。還有,若在連線狀態突然斷線,應可在 ADOConnection 的 onDisconnect 事件來設定狀態為離線以免之後的連線停住。 不知能否切合你的情況
P.D.
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-01 15:34:08 IP:61.66.xxx.xxx 未訂閱
Justmade兄! 說真的, 我之前也是用add,add 方法, 後來改用 sql.text發現真的速度提昇不少唉! 我遇到了知音! 我先前也想過用flag來控制, 但因為現在我提供的是一個button, 讓user可以 隨時想上就上, 我也是在客戶反應後才發現有這樣嚴重的問題(就是斷線會造成 adoquery.sql.text指定嚴重當機), 因為客戶有時候並不知道InterNet已斷線或 沒連線, 所以才緊急的改成現在的用法, 不過我並不滿意這樣的使用, 我有想過是否storeprocedure可以解決, 但M$的 store procedure 我沒有用過, 要如何做, 不知從那下手, 也不知道是否有用, 如果 各位有更好, 更有效率的方法可否不吝提供, 謝謝囉! 發表人 - P.D. 於 2003/04/01 15:35:58
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-01 19:18:38 IP:218.32.xxx.xxx 未訂閱
小弟測試結果, 如 hagar 所言: ADOQuery.ParamCheck := False , ADOConnection 就不會自動 connect. 壞處是 ADOQuery.Parameters property 都不會自動 add TParameter, 必須 run-time 手動處理.    ADOConnection.ConnectionTimeout 把它放小不知有沒有用 ?... 自欺欺人, 呵呵 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=7540183&CC=168637"> 發表人 - Mickey 於 2003/04/01 19:51:27
P.D.
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-01 21:40:06 IP:61.66.xxx.xxx 未訂閱
引言: 小弟測試結果, 如 hagar 所言: ADOQuery.ParamCheck := False , ADOConnection 就不會自動 connect. 壞處是 ADOQuery.Parameters property 都不會自動 add TParameter, 必須 run-time 手動處理. ADOConnection.ConnectionTimeout 把它放小不知有沒有用 ?... 自欺欺人, 呵呵 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=7540183&CC=168637"> 發表人 - Mickey 於 2003/04/01 19:51:27
其實我一直很懷疑 ADO的TIMEOUT功能, 因為我曾投入很長的時間在測試 TIMEOUT值, 在InterNet無法溝通的情況下, TimeOut縮短是否會降低偵測的 時間, 結果是不論調到1秒 或加到 5分鐘, 似乎都是一樣的狀況, 也就是 大約都花在30-50秒之間才會有回應no connect, 所以調整 TimeOut好像不是 很有用, 而且我這個案例是當住一直按我按ctrl-alt-del, 程式沒有回應才有 辦法中斷!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-04-02 07:36:35 IP:202.39.xxx.xxx 未訂閱
想到一個不知行不行? 就是在指定或變更 SQL 值之前 先將 TADOQuery.Connection 這個屬性值拿掉 --- Have you ever wondered what it would be like?
P.D.
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-04-02 14:09:08 IP:61.66.xxx.xxx 未訂閱
引言: 想到一個不知行不行? 就是在指定或變更 SQL 值之前 先將 TADOQuery.Connection 這個屬性值拿掉 --- Have you ever wondered what it would be like?
不解唉! 如何拿掉 CONNECTION屬性, 原先我寫在 DataModule的方式也沒有 觸及 connection ! 我post上我這段寫在Datamoudle中的 oncreate程式碼, 給各位看倌
     SQLparm1:= 'Provider='                  trim(readINI('EPA','Prov')) 
                'Password='                  CL_Decrypt(trim(readINI('EPA','Pass'))) 
                'Persist Security Info='     trim(readINI('EPA','Pers')) 
                'User ID='                   CL_Decrypt(trim(readINI('EPA','User'))) 
                'Initial Catalog='           CL_Decrypt(trim(readINI('EPA','Dat1'))) 
                'Data Source='               CL_Decrypt(trim(readINI('EPA','Sour'))) 
                'Locale Identifier='         trim(readINI('EPA','Iden')) 
                'Connect Timeout='           trim(readINI('EPA','Time')) 
                'Use Procedure for Prepare=' trim(readINI('EPA','Prep')) 
                'Auto Translate='            trim(readINI('EPA','Tran')) 
                'Packet Size='               trim(readINI('EPA','Size')) 
                'Workstation ID='            trim(readINI('EPA','Work'));
     ADOcust.ConnectionString:= SQLparm1;
     tbl1:= CL_Decrypt(trim(readINI('EPA','Tbl1')));  // car
     sql1:= 'select CAR_NO, CAR_TYPE, OWNER_NAME, ' 
            'ADDR, BRAND, CC, ENGINE_NO, OP_DATE, ISSUE_DATE ' 
            'from ' tbl1 ' where CAR_NO= :iCAR_NO';

原先還有一列是
     ADOquery_Cust.SQL.text:= sql1;
但就是如果InterNet是offline 會造成在這行停住死當, 就算超過5分鐘, 
系統也跳不下來    
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-04-02 14:48:40 IP:202.39.xxx.xxx 未訂閱
小弟的意思是在指定或變更 TADOQuery 的 SQL 屬性前 先拿掉 TADOQuery 的 Connection 屬性 如果您的 TADOQuery 是透過 TADOConnection 來連 DB 的話 比方說:
begin
  ADOQuery1.Connection := nil;
  ADOQuery1.SQL.Text := '...';
end;
然後直的要 Open TADOQuery 的時候, 再指定 TADOQuery 的 Connection 屬性, 例:
begin
  ADOQeury1.Connection := ADOConnection1;
  ADOQuery1.Open;
end;
--- 每個人都是一本書
P.D.
版主


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-04-03 12:06:33 IP:61.66.xxx.xxx 未訂閱
引言: 小弟的意思是在指定或變更 TADOQuery 的 SQL 屬性前 然後直的要 Open TADOQuery 的時候, 再指定 TADOQuery 的 Connection 屬性, 例:
begin
  ADOQeury1.Connection := ADOConnection1;
  ADOQuery1.Open;
end;
不好意思! 這篇討論勞煩所有版主及網友都出動了, hagar兄所提出的方法 我測過的確可以在Internet offline時過, 不會有當機, 不過我有一個疑問 在datamodule oncreate 時這樣寫 ADOquery1.connection:= nil; ADOquery1.SQL.Text:= 'select .... where NO= :iNO'; 然後在我設置的button 上指定 ADOquery1.connection:= '....'; ADOquery1.parameters.parambyname('iNO').Value:= mNo; ADOquery1.Open; 的做法與我在 button上這樣寫(在oncreate時不下上面那二列) ADOquery1.Close; ADOquery1.SQL.Text:= 'select .... where NO= :iNO'; ADOquery1.parameters.parambyname('iNO').Value:= mNo; ADOquery1.Open; 是不是都會使得M$SQL 每一次都會重置 SQL , 因為我也沒有什麼相關 SQL工具可以測其效能, 如果是的話, 那這樣的做法只能解決到一個目的 就是在SQL.TEXT指定時不會有問題, 但在效能上沒有提昇, 因為這關係到 上千萬筆資料的讀取, 目前我還無法取得實際的結果, 我先試試看, 如果 有好消息再向各位公佈! 本案先結案了, 謝謝各位!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-04-03 13:06:55 IP:202.39.xxx.xxx 未訂閱
有辦法先比較新的 SQL 與舊的 SQL 是否不同 若不同再做變更 SQL 的動作呢? --- 每個人都是一本書
P.D.
版主


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-04-03 17:24:01 IP:61.66.xxx.xxx 未訂閱
引言: 有辦法先比較新的 SQL 與舊的 SQL 是否不同 若不同再做變更 SQL 的動作呢? --- 每個人都是一本書
我想, 本案的問題不在於變更SQL的命令, 因為我的SQL命令是不會變的 而是在 1.指定 SQL.TEXT 前如果Internet offline, 會造成 SQL.TEXT 這裡當機 2.想求得更好的效率, 不要每一次都令SERVER要重置SQL.TEXT 看來似乎還沒有辦法找到更好的方式囉!
系統時間:2024-05-17 10:29:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!