資料庫重新連線,但Query仍為舊的資料庫 |
尚未結案
|
viya
一般會員 發表:16 回覆:19 積分:7 註冊:2008-09-16 發送簡訊給我 |
各位好:
我設計一個自動執行的程式,共有兩個Form。(FormA,FormB) FormA傳遞資料庫連線參數給FormB,進行轉檔。 轉檔動作為多次執行,我利用迴圈去給參數 在FormA的程式碼如下: formB:=TformB.create(Application); with formB do begin Databaes1.close; Databaes1.connected:=false; 於formshow也抓到Databaes1.Aliasname:='BBB' 程式的Query就可連線至正確的資料庫(BBB、CCC)。 (用memo則不行,而我的程式是自動執行的程式,不可以用showmessage) 我不懂,是否的程式撰寫上缺了什麼??還是Delphi資料庫物件連線的問題?? 想請教各位,這個問題是否有解決方法,謝謝。 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
1.加一個ShowMessage 就可以按程式正常運作, 這種狀況我也遇過, 明明程式寫法都沒有問題, 但就是跑舊的東東, 弄到最後加一個Showmessage就好了, 真是很莫名其妙, 但我沒解, 因為後來拿掉showmessage又好了
2.不知道你的TDataBase 是放在FormA, 還是FormB, 還是兩個都有 看你的寫法, 我不知道對不對啦, 但如果是放在FormA, 我會這麼寫 Databaes1.close; Databaes1.connected:=false; Databaes1.AliasName:='AAA'; //依序為BBB、CCC、DDD Databaes1.connected:=true; end; end; 為求保險,我在formb的formshow階段,也進行Databaes1重新連線的動作。 我的問題是,當我連線不同的資料庫(EX:BBB)時,可是,程式的Query還是連線至'AAA'。 更神奇的是,我在Formb增加一個showmessage後,程式的Query就可連線至正確的資料庫(BBB、CCC)。 (用memo則不行,而我的程式是自動執行的程式,不可以用showmessage) 我不懂,是否的程式撰寫上缺了什麼??還是Delphi資料庫物件連線的問題?? 想請教各位,這個問題是否有解決方法,謝謝。
編輯記錄
P.D. 重新編輯於 2011-11-07 08:40:53, 註解 無‧
|
viya
一般會員 發表:16 回覆:19 積分:7 註冊:2008-09-16 發送簡訊給我 |
謝謝PD的回應
1.我之前也碰過一次,如您所說的,之後又可以連. 但這次遇到的是拿掉showmessage,還是會出錯. 2.我的Database元件都放在FormB,(FormA無任何Dataset物件) FormA會傳遞參數給Formb. 寫法是 For i:= 1 to 9 case i of 1: database_aliasname='AAA'; btn.click; 2: database_aliasname='BBB'; btn.click; (------以下簡略-------) procedure TFormA.btnclick(sender); begin FormB:=TFormB.Create(Application); with TFormB do begin Databaes1.close; Databaes1.connected:=false; DataBase1.aliasname:=database_aliasname; Databaes1.connected:=true; end; end; //以上是在FormA的作法 而我在Formb,除了將剛剛的連線再重連一次外, Formb的close的地方,也增加 For i := 0 to ComponentCount-1 do if (Components[i] is TDataSet ) then (Components[i] as TDataSet).Close; Action:=cafree; FormB:=nil; 確保FormB的物件都被Release掉,但結果還是一樣,抓到舊的連線.真是很無奈. ===================引 用 P.D. 文 章=================== 1.加一個ShowMessage 就可以按程式正常運作, 這種狀況我也遇過, 明明程式寫法都沒有問題, 但就是跑舊的東東, 弄到最後加一個Showmessage就好了, 真是很莫名其妙, 但我沒解, 因為後來拿掉showmessage又好了 2.不知道你的TDataBase 是放在FormA, 還是FormB, 還是兩個都有 看你的寫法, 我不知道對不對啦, 但如果是放在FormA, 我會這麼寫 Databaes1.close; Databaes1.connected:=false; Databaes1.AliasName:='AAA'; //依序為BBB、CCC、DDD Databaes1.connected:=true; end; end; 為求保險,我在formb的formshow階段,也進行Databaes1重新連線的動作。 我的問題是,當我連線不同的資料庫(EX:BBB)時,可是,程式的Query還是連線至'AAA'。 更神奇的是,我在Formb增加一個showmessage後,程式的Query就可連線至正確的資料庫(BBB、CCC)。 (用memo則不行,而我的程式是自動執行的程式,不可以用showmessage) 我不懂,是否的程式撰寫上缺了什麼??還是Delphi資料庫物件連線的問題?? 想請教各位,這個問題是否有解決方法,謝謝。
編輯記錄
viya 重新編輯於 2011-11-07 18:05:21, 註解 無‧
|
viya
一般會員 發表:16 回覆:19 積分:7 註冊:2008-09-16 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
恭喜你找到問題了, session是關聯到 BDE 的參數設定, 或許當你指定 TDatabase.AliasName時, 這組參數早已經被update到bde alias 中,
然後又指給 Query1 關聯, 一切都是buffer的問題吧! 沒有特別去研究, 以上純屬個人猜測! ===================引 用 viya 文 章=================== 剛剛測試到 將Query的dbsession先關掉,可以解決此問題. Query1.DBSession.Close; //再重新進行DataBase連線,即可. 不過還滿奇怪的,formB物件都已經release掉了,為何dbsession還存在? |
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
有沒有興趣再測試一下....
看你的程式,在 FormB close 時,只針對 TDataSet 做 close 。 要不要試著把 TDataBase active 設成 False 看看。 ===================引 用 viya 文 章=================== 剛剛測試到 將Query的dbsession先關掉,可以解決此問題. Query1.DBSession.Close; //再重新進行DataBase連線,即可. 不過還滿奇怪的,formB物件都已經release掉了,為何dbsession還存在? |
viya
一般會員 發表:16 回覆:19 積分:7 註冊:2008-09-16 發送簡訊給我 |
carstyc 您好:
TDataBase 似乎沒有active的屬性 我有設定過 TQuery.active:=false,但一樣無效. : ( 我原本以為是BDE的問題 重新灌了Delphi ,但還是一樣,Query還是連到舊的資料庫 . ===================引 用 carstyc 文 章=================== 有沒有興趣再測試一下.... 看你的程式,在 FormB close 時,只針對 TDataSet 做 close 。 要不要試著把 TDataBase active 設成 False 看看。 ===================引 用 viya 文 章=================== 剛剛測試到 將Query的dbsession先關掉,可以解決此問題. Query1.DBSession.Close; //再重新進行DataBase連線,即可. 不過還滿奇怪的,formB物件都已經release掉了,為何dbsession還存在?
編輯記錄
viya 重新編輯於 2011-11-10 02:56:07, 註解 無‧
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
Sorry:
是 TDatabaes的 connected = false 我猜可能是只將 TQuery 設成 active=false; 但實際上對 DB 的 Connection 還沒有切斷..... 所以最根本的辦法就是將 TDataBase的Connection 切斷..... 還是要測試一下比較準... ===================引 用 viya 文 章=================== carstyc 您好: TDataBase 似乎沒有active的屬性 我有設定過 TQuery.active:=false,但一樣無效. : ( 我原本以為是BDE的問題 重新灌了Delphi ,但還是一樣,Query還是連到舊的資料庫 . ===================引 用 carstyc 文 章=================== 有沒有興趣再測試一下.... 看你的程式,在 FormB close 時,只針對 TDataSet 做 close 。 要不要試著把 TDataBase active 設成 False 看看。 ===================引 用 viya 文 章=================== 剛剛測試到 將Query的dbsession先關掉,可以解決此問題. Query1.DBSession.Close; //再重新進行DataBase連線,即可. 不過還滿奇怪的,formB物件都已經release掉了,為何dbsession還存在?
編輯記錄
carstyc 重新編輯於 2011-11-10 05:58:37, 註解 無‧
|
Victor4022
中階會員 發表:0 回覆:76 積分:90 註冊:2011-02-20 發送簡訊給我 |
小弟沒使用過 BDE 內的元件, 大部份是使用 ADO.
用 TCPView (sysinternals 工具) 實驗 ADO 心得如下: 1. "TADOConnection.Connect := False ", 只是將 TADOConnection 狀態設成不連線, 如果曾經連線過, TCPView 在 "TADOConnection.Connect := False" 情況下, 根據 TCPView 顯示, 依然保持一個 connection. 2. 嘗試呼叫 TADOConnection 的解構子, 才會正確將 connection 關掉, TCPView 不再出現此筆 connection 資訊. 實驗至此, 只能合理懷疑 TADOConnection的解構子(如下) 的某些動作, 才會真正 close connection, [code delphi] destructor TADOConnection.Destroy; begin Destroying; Close; ClearRefs; FreeAndNil(FCommands); if FConnEventsID > 0 then OleCheck(ConnectionPoint.UnAdvise(FConnEventsID)); FConnEventsID := 0; FConnectionObject := nil; inherited Destroy; end; [/code] 3. 同一個 TADOConnection 物件, 同個 database name : Connected := True -> False -> True , 依然維持一個 connection 4. 同一個 TADOConnection 物件, 不同個 database name : Connected := True -> False 設定另一個 database name -> True , 出現第二個 connection,第一個 connection 不會 close, 兩者設 "Connected := False", 依然佔去 2 個 connection 目前只能確認採用 TADOCOnnection 並不會真的關閉與資料庫連線, 不確定開版大大的 BDE 問題是否可能與此現象相同, 但建議可使用 TCPView 工具實驗一次, 小弟猜測可能您將 TDatabse 放置 formA, 而 formB 是使用 formA 的 TDatabase, 導致 formB 完整 Free And Nil 還是連到舊 DB(因為 TDababase 在 formA 並未解構子再重新建立) 相信您應該能確切找到問題點 :) ===================引 用 carstyc 文 章=================== Sorry: 是 TDatabaes的 connected = false 我猜可能是只將 TQuery 設成 active=false; 但實際上對 DB 的 Connection 還沒有切斷..... 所以最根本的辦法就是將 TDataBase的Connection 切斷..... 還是要測試一下比較準... ===================引 用 viya 文 章=================== carstyc 您好: TDataBase 似乎沒有active的屬性 我有設定過 TQuery.active:=false,但一樣無效. : ( 我原本以為是BDE的問題 重新灌了Delphi ,但還是一樣,Query還是連到舊的資料庫 . ===================引 用 carstyc 文 章=================== 有沒有興趣再測試一下.... 看你的程式,在 FormB close 時,只針對 TDataSet 做 close 。 要不要試著把 TDataBase active 設成 False 看看。 ===================引 用 viya 文 章=================== 剛剛測試到 將Query的dbsession先關掉,可以解決此問題. Query1.DBSession.Close; //再重新進行DataBase連線,即可. 不過還滿奇怪的,formB物件都已經release掉了,為何dbsession還存在?
編輯記錄
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
Victor 大大果然厲害
果然也找出了 ADO 的特性.... 我剛剛也試了一下...不過我沒有 TCPView ,我是直接觀察 DB Server 上的 Connection 發現 TADOConnect 真的 disconnect 還是會佔著Connection 但 TDataBase 是會釋放的 以上是實驗確認的....供大家參考 ===================引 用 Victor4022 文 章=================== 小弟沒使用過 BDE 內的元件, 大部份是使用 ADO. 用 TCPView (sysinternals 工具) 實驗 ADO 心得如下: 1. "TADOConnection.Connect := False ", 只是將 TADOConnection 狀態設成不連線, 如果曾經連線過, TCPView 在 "TADOConnection.Connect := False" 情況下, 根據 TCPView 顯示, 依然保持一個 connection. 2. 嘗試呼叫 TADOConnection 的解構子, 才會正確將 connection 關掉, TCPView 不再出現此筆 connection 資訊. 實驗至此, 只能合理懷疑 TADOConnection的解構子(如下) 的某些動作, 才會真正 close connection, [code delphi] destructor TADOConnection.Destroy; begin Destroying; Close; ClearRefs; FreeAndNil(FCommands); if FConnEventsID > 0 then OleCheck(ConnectionPoint.UnAdvise(FConnEventsID)); FConnEventsID := 0; FConnectionObject := nil; inherited Destroy; end; [/code] 3. 同一個 TADOConnection 物件, 同個 database name :Connected :=True -> False -> True , 依然維持一個 connection 4. 同一個 TADOConnection 物件, 不同個 database name :Connected :=True -> False 設定另一個 database name-> True , 出現第二個 connection,第一個 connection 不會 close, 兩者設 "Connected := False", 依然佔去 2 個 connection 目前只能確認採用 TADOCOnnection 並不會真的關閉與資料庫連線, 不確定開版大大的 BDE 問題是否可能與此現象相同, 但建議可使用 TCPView 工具實驗一次, 小弟猜測可能您將 TDatabse 放置 formA, 而 formB 是使用 formA 的 TDatabase, 導致 formB 完整 Free And Nil 還是連到舊 DB(因為 TDababase 在 formA 並未解構子再重新建立) 相信您應該能確切找到問題點 :) ===================引 用 carstyc 文 章=================== Sorry: 是 TDatabaes的 connected = false 我猜可能是只將 TQuery 設成 active=false; 但實際上對 DB 的 Connection 還沒有切斷..... 所以最根本的辦法就是將 TDataBase的Connection 切斷..... 還是要測試一下比較準... ===================引 用 viya 文 章=================== carstyc 您好: TDataBase 似乎沒有active的屬性 我有設定過 TQuery.active:=false,但一樣無效. : ( 我原本以為是BDE的問題 重新灌了Delphi ,但還是一樣,Query還是連到舊的資料庫 . ===================引 用 carstyc 文 章=================== 有沒有興趣再測試一下.... 看你的程式,在 FormB close 時,只針對 TDataSet 做 close 。 要不要試著把 TDataBase active 設成 False 看看。 ===================引 用 viya 文 章=================== 剛剛測試到 將Query的dbsession先關掉,可以解決此問題. Query1.DBSession.Close; //再重新進行DataBase連線,即可. 不過還滿奇怪的,formB物件都已經release掉了,為何dbsession還存在? |
viya
一般會員 發表:16 回覆:19 積分:7 註冊:2008-09-16 發送簡訊給我 |
非常感謝各位前輩的熱心協助,ktop真的是一個好地方 : )
1.因為我並未使用過,TCPView 我會再研究看看.非常感謝V大與C大的幫忙測試,及所提供的方向. 原來ADOConnection會有這樣的特性. 2.我的formA的功能僅作參數傳遞) 所有的Tdataset物件,都放在formB上的Query還是抓到舊的。 (而且加了showmessage,連線就會抓到正確的,莫非showmessage有什麼神奇的功能@@?????????) ===================引 用 Victor4022 文 章=================== 小弟沒使用過 BDE 內的元件, 大部份是使用 ADO. 用 TCPView (sysinternals 工具) 實驗 ADO 心得如下: 1. "TADOConnection.Connect := False ", 只是將 TADOConnection 狀態設成不連線, 如果曾經連線過, TCPView 在 "TADOConnection.Connect := False" 情況下, 根據 TCPView 顯示, 依然保持一個 connection. 2. 嘗試呼叫 TADOConnection 的解構子, 才會正確將 connection 關掉, TCPView 不再出現此筆 connection 資訊. 實驗至此, 只能合理懷疑 TADOConnection的解構子(如下) 的某些動作, 才會真正 close connection, [code delphi] destructor TADOConnection.Destroy; begin Destroying; Close; ClearRefs; FreeAndNil(FCommands); if FConnEventsID > 0 then OleCheck(ConnectionPoint.UnAdvise(FConnEventsID)); FConnEventsID := 0; FConnectionObject := nil; inherited Destroy; end; [/code] 3. 同一個 TADOConnection 物件, 同個 database name :Connected :=True -> False -> True , 依然維持一個 connection 4. 同一個 TADOConnection 物件, 不同個 database name :Connected :=True -> False 設定另一個 database name-> True , 出現第二個 connection,第一個 connection 不會 close, 兩者設 "Connected := False", 依然佔去 2 個 connection 目前只能確認採用 TADOCOnnection 並不會真的關閉與資料庫連線, 不確定開版大大的 BDE 問題是否可能與此現象相同, 但建議可使用 TCPView 工具實驗一次, 小弟猜測可能您將 TDatabse 放置 formA, 而 formB 是使用 formA 的 TDatabase, 導致 formB 完整 Free And Nil 還是連到舊 DB(因為 TDababase 在 formA 並未解構子再重新建立) 相信您應該能確切找到問題點 :)
編輯記錄
viya 重新編輯於 2011-11-10 20:49:00, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |