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

資料庫重新連線,但Query仍為舊的資料庫

尚未結案
viya
一般會員


發表:16
回覆:19
積分:7
註冊:2008-09-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-11-07 17:37:01 IP:202.3.xxx.xxx 訂閱
各位好:
我設計一個自動執行的程式,共有兩個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-11-07 23:40:25 IP:118.169.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-11-08 09:04:04 IP:202.3.xxx.xxx 訂閱
謝謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-11-08 11:30:32 IP:202.3.xxx.xxx 訂閱
剛剛測試到

將Query的dbsession先關掉,可以解決此問題.
Query1.DBSession.Close;
//再重新進行DataBase連線,即可.

不過還滿奇怪的,formB物件都已經release掉了,為何dbsession還存在?
P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-11-09 10:28:11 IP:118.169.xxx.xxx 未訂閱
恭喜你找到問題了, 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-11-09 23:25:01 IP:219.84.xxx.xxx 訂閱
有沒有興趣再測試一下....

看你的程式,在 FormB close 時,只針對 TDataSet 做 close 。

要不要試著把 TDataBase active 設成 False 看看。



===================引 用 viya 文 章===================
剛剛測試到

將Query的dbsession先關掉,可以解決此問題.
Query1.DBSession.Close;
//再重新進行DataBase連線,即可.

不過還滿奇怪的,formB物件都已經release掉了,為何dbsession還存在?
viya
一般會員


發表:16
回覆:19
積分:7
註冊:2008-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-11-10 17:52:00 IP:202.3.xxx.xxx 訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-11-10 20:56:46 IP:219.84.xxx.xxx 訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-11-11 06:59:54 IP:122.126.xxx.xxx 訂閱
小弟沒使用過 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還存在?
編輯記錄
Victor4022 重新編輯於 2011-11-10 16:03:18, 註解 未實驗 BDE ‧
Victor4022 重新編輯於 2011-11-10 16:05:41, 註解 無‧
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-11-11 09:47:36 IP:203.79.xxx.xxx 訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-11-11 11:47:10 IP:202.3.xxx.xxx 訂閱
非常感謝各位前輩的熱心協助,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, 註解 無‧
系統時間:2024-04-18 13:16:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!