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

Query open會掛掉

缺席
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-04 09:40:30 IP:61.58.xxx.xxx 未訂閱
請教前輩 小弟是想把Login的User Show在AppServer的DBGrid上,ADOQuery是放在 Remote Data Module上,在Remote Data Module的OnCreate時將ADOQuery Open,但是App Server就會hold住,為什麼呢?? 快瘋了@@| 謝謝
wuabc
初階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-04 10:34:49 IP:203.204.xxx.xxx 未訂閱
引言: 請教前輩 小弟是想把Login的User Show在AppServer的DBGrid上,ADOQuery是放在 Remote Data Module上,在Remote Data Module的OnCreate時將ADOQuery Open,但是App Server就會hold住,為什麼呢?? 快瘋了@@| 謝謝
比較可能的原因是ADOQuery正在等待DB的Login 如果是的話,論壇上應不難找到solution Ted Wu
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-04 10:54:48 IP:61.58.xxx.xxx 未訂閱
引言: 比較可能的原因是ADOQuery正在等待DB的Login 如果是的話,論壇上應不難找到solution Ted Wu
非常感謝前輩的回答,小弟現在改在ADOConnection的OnConnectComplete下 ADOQuery.Open,一樣還是hold住,所以小弟想應該不是這問題,但小在Button 的Onclick下ADOQuery.Open就正常 P_P~~~
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-04 14:40:30 IP:61.58.xxx.xxx 未訂閱
引言:
引言: 比較可能的原因是ADOQuery正在等待DB的Login 如果是的話,論壇上應不難找到solution Ted Wu
非常感謝前輩的回答,小弟現在改在ADOConnection的OnConnectComplete下 ADOQuery.Open,一樣還是hold住,所以小弟想應該不是這問題,但小在Button 的Onclick下ADOQuery.Open就正常 P_P~~~
問題解決了,不要將Remote Data Module的Threading Model設為 Apartment就行了,但是為什麼會這樣呢,有前輩可以指點迷津嗎, 謝謝
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-04 14:48:57 IP:203.204.xxx.xxx 未訂閱
引言: 現在問題已解決了,原來是不要將Threading Model設為Apartment, 就行了,為什麼會這樣不曉得何兄是否能指點迷津,感激不盡,謝謝
我是都設為Apartment,也是有你說的這種情況(也就是在RDM的事件做視覺化相關的程式碼(在DBGrid秀資料)就會當掉),所以後來都改用其他方式(例如:寫Function由前端呼叫再做)。 為什麼要設為Apartment,書(Delphi4.0徹底研究)上說明是每次只能處理一個Client的Request,所以所處理的資料是安全的,可是必須防止共用變數的衝突。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-04 15:53:52 IP:61.58.xxx.xxx 未訂閱
感謝jieshu兄,小弟已改為您說的方式了,但又出現另一問題了, 我在Type Library裡加一Method為AddUser,當Client一執行程式 就呼叫此Method,此Method是將User的登入資訊Insert到資料庫裡 然後Close再Open,第一個Client連上時會show在DBGrid上,但是第 二個Client連上時,卻Show不出來,但第二個Cleint的資料確實有寫 入資料庫裡,why~~~,好奇怪呀,是那裡小弟忽略了嗎?? 謝謝
billsons
一般會員


發表:1
回覆:10
積分:2
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-11-04 17:08:21 IP:218.17.xxx.xxx 未訂閱
我在使用MIDAS开发的时候经常会遇到当使用第一个客户端增加资料后再另一个客户端SHOW不出。我想真正的原因是MIDAS的机制吧。我认为MIDAS当时的提出是BORLAND为两层到三层的解决方案,这只是一个迁移的解决方案。对于解决复杂的三层问题有缺陷。我建议你使用MTS/COM 。因为MTS的机制是在每次要SHOW内容时都要初始化,使用完资源后就RELEASE掉。不过我没有试过就是在MIDAS中模拟MTS的运作机制,但我不确定它是否能解决你的问题。 我想再多说一点,当我们要真正使用多层架构去实现一个系统时我们应该抛弃MIDAS,使用真正的面向对象的分析方法,真正分析出哪些是实体对象、哪些是协调对象、哪些是功能对象。只有这样,我们做出的系统才是最有效率的,同时也是在部署中最容易的。不过在大陆我还没有看到一本书这样讲过,我的上述内容是我看JAVA的EJB时学到的思想,而我把它用在了MTS/COM 上。对于EJB里面有明确的概念,而且现在市面上这样的书也很好找。不如大家把其思想拿来借鉴。 發表人 - billsons 於 2002/11/04 17:20:25
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-11-04 19:21:26 IP:203.204.xxx.xxx 未訂閱
引言: 感謝jieshu兄,小弟已改為您說的方式了,但又出現另一問題了, 我在Type Library裡加一Method為AddUser,當Client一執行程式 就呼叫此Method,此Method是將User的登入資訊Insert到資料庫裡 然後Close再Open,第一個Client連上時會show在DBGrid上,但是第 二個Client連上時,卻Show不出來,但第二個Cleint的資料確實有寫 入資料庫裡,why~~~,好奇怪呀,是那裡小弟忽略了嗎?? 謝謝
你可用SQL Server的Profile追蹤看看,但是為什麼要Close再Open呢? 你的DataSet要放在Show的那個Form上,Function直接對此DataSet新增資料即可,並不會有多人無法即時更新問題。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-11-04 19:25:15 IP:203.204.xxx.xxx 未訂閱
引言: 我在使用MIDAS开发的时候经常会遇到当使用第一个客户端增加资料后再另一个客户端SHOW不出。我想真正的原因是MIDAS的机制吧。我认为MIDAS当时的提出是BORLAND为两层到三层的解决方案,这只是一个迁移的解决方案。对于解决复杂的三层问题有缺陷。我建议你使用MTS/COM 。因为MTS的机制是在每次要SHOW内容时都要初始化,使用完资源后就RELEASE掉。不过我没有试过就是在MIDAS中模拟MTS的运作机制,但我不确定它是否能解决你的问题。 我想再多说一点,当我们要真正使用多层架构去实现一个系统时我们应该抛弃MIDAS,使用真正的面向对象的分析方法,真正分析出哪些是实体对象、哪些是协调对象、哪些是功能对象。只有这样,我们做出的系统才是最有效率的,同时也是在部署中最容易的。不过在大陆我还没有看到一本书这样讲过,我的上述内容是我看JAVA的EJB时学到的思想,而我把它用在了MTS/COM 上。对于EJB里面有明确的概念,而且现在市面上这样的书也很好找。不如大家把其思想拿来借鉴。 發表人 - billsons 於 2002/11/04 17:20:25
ClientDataSet.Refresh就可以更新,ccchen兄有提過!你可搜尋看看。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
wuabc
初階會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-11-04 21:01:55 IP:203.204.xxx.xxx 未訂閱
Midas與MTS所要達成的功能並不一樣所以並無比較的必要,合理的說法應該說你要不要用Midas這組快速元件來建構你的n-Tie程式而已。 cubi兄所遇到的問題,似乎是將RDM的ADOQuery直接連到Main Form上的DBGrid來顯示資料,如此造成第二個Client連接上來的時候DBGrid無法顯現第二個Client的狀態(我又猜錯了嗎?),如果真是這樣,結果當然如您所見,因為兩個Client在不同Thread所致。如果將ADOQuery搬到Form上,再於RDM.AddUser Method內處理 MainForm.ADOQuery.close/MainForm.AdoQuery.Open即可達成 Ted Wu
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-11-05 08:45:31 IP:61.58.xxx.xxx 未訂閱
引言: 你可用SQL Server的Profile追蹤看看,但是為什麼要Close再Open呢? 你的DataSet要放在Show的那個Form上,Function直接對此DataSet新增資料即可,並不會有多人無法即時更新問題。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
 
現在當client上線時會呼叫AddUser(p1,p2,p3...)的Method,
在AddUser裡只寫了幾行:

  with frmMain.adoLogin do
  begin
    if Not Active then Open;
    Append;
  end;    但在Server端會出現下面錯誤訊息:
引數可能有類型錯誤,或超過可接受的範圍,或與其它引數衝突。
所以小弟就用SQL CMD將資料Insert到資料庫,所以需close再open
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-11-05 08:48:30 IP:61.58.xxx.xxx 未訂閱
引言: Midas與MTS所要達成的功能並不一樣所以並無比較的必要,合理的說法應該說你要不要用Midas這組快速元件來建構你的n-Tie程式而已。 cubi兄所遇到的問題,似乎是將RDM的ADOQuery直接連到Main Form上的DBGrid來顯示資料,如此造成第二個Client連接上來的時候DBGrid無法顯現第二個Client的狀態(我又猜錯了嗎?),如果真是這樣,結果當然如您所見,因為兩個Client在不同Thread所致。如果將ADOQuery搬到Form上,再於RDM.AddUser Method內處理 MainForm.ADOQuery.close/MainForm.AdoQuery.Open即可達成 Ted Wu
沒錯!就如Ted前輩說的這樣,現小弟已如前輩說的已將ADOQuery從RDM搬到
MainForm上了,至於為會要Close再Open如上篇所說明,再次感謝前輩撥空
回答,謝謝
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-11-05 09:51:51 IP:203.204.xxx.xxx 未訂閱
引言:
 
現在當client上線時會呼叫AddUser(p1,p2,p3...)的Method,
在AddUser裡只寫了幾行:

  with frmMain.adoLogin do
  begin
    if Not Active then Open;
    Append;
  end;    但在Server端會出現下面錯誤訊息:
引數可能有類型錯誤,或超過可接受的範圍,或與其它引數衝突。
所以小弟就用SQL CMD將資料Insert到資料庫,所以需close再open
你可用profiler查看為何重新Open後,有的資料沒有出來。 我認為Close再Open是最不好的方式,既然知道錯誤訊息了,應該想辦法解決,之前有遇過,如果Server Function傳進來的參數宣告為WideString,直接把值給DataSet欄位會有問題,所以就宣告一個字串變數來接這個參數,再把變數值給DataSet。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-11-05 10:16:52 IP:61.58.xxx.xxx 未訂閱
引言:
引言:
 
現在當client上線時會呼叫AddUser(p1,p2,p3...)的Method,
在AddUser裡只寫了幾行:

  with frmMain.adoLogin do
  begin
    if Not Active then Open;
    Append;
  end;    但在Server端會出現下面錯誤訊息:
引數可能有類型錯誤,或超過可接受的範圍,或與其它引數衝突。
所以小弟就用SQL CMD將資料Insert到資料庫,所以需close再open
你可用profiler查看為何重新Open後,有的資料沒有出來。 我認為Close再Open是最不好的方式,既然知道錯誤訊息了,應該想辦法解決,之前有遇過,如果Server Function傳進來的參數宣告為WideString,直接把值給DataSet欄位會有問題,所以就宣告一個字串變數來接這個參數,再把變數值給DataSet。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
希望又出現了, 小弟發現若將
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-11-05 10:54:19 IP:203.204.xxx.xxx 未訂閱
引言: 希望又出現了, 小弟發現若將>< face="Verdana, Arial, Helvetica"> 那就奇怪了,你不妨改用ClientDataSet來操作看看。我都是這樣做,沒什麼問題的。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2002-11-05 11:18:59 IP:61.58.xxx.xxx 未訂閱
引言: 那就奇怪了,你不妨改用ClientDataSet來操作看看。我都是這樣做,沒什麼問題的。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
會不會是D6的Bug,您是說在MainForm上使用ClientDataSet嗎?? 嗯~~~~~~~,小弟從未用過,不知前輩知道那有參考範例嗎?? 感激不盡
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#17 引用回覆 回覆 發表時間:2002-11-05 13:10:56 IP:61.58.xxx.xxx 未訂閱
小弟現在不用DBGrid來Show了,小弟改用ListView來Show了,就OK了    但是...嗚嗚~~~又有另外一個問題了,
在Client的OnClose會呼叫Server的DelUser()的Method,
DelUser只是填入Client的Logout時間這一個動作而已
 
Client程式

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DCOMConnection1.AppServer.DelUser(StrToInt(VarToStr(AutoID)));
end;     
Server的DelUser程式    procedure TMISAPSvr.DelUser(AutoID: Integer);
begin
  with frmMain.adoLogin do
  begin
    if Not Active then Open;
    if Locate('AutoID', AutoID, []) then
    begin
      Edit;
      FieldByName('LogoutDT').AsDateTime := Now;
      Post;
      _UpdateShow;
    end;
  end;
end;    問題如下
ClientA 登入,ClientB 再登入,
然後ClientA 先離開,ClientB 再離開沒問題,
但是ClientB 先離開,ClientA 再離開會出現如下
錯誤訊息:
Missing Connection or Connection String
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#18 引用回覆 回覆 發表時間:2002-11-05 13:16:11 IP:203.204.xxx.xxx 未訂閱
引言: 會不會是D6的Bug,您是說在MainForm上使用ClientDataSet嗎?? 嗯~~~~~~~,小弟從未用過,不知前輩知道那有參考範例嗎?? 感激不盡
我是用Delphi5不曉得。 和你在Client端使用一樣,只是不用指定RemoteServer。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#19 引用回覆 回覆 發表時間:2002-11-05 13:26:25 IP:203.204.xxx.xxx 未訂閱
引言:
小弟現在不用DBGrid來Show了,小弟改用ListView來Show了,就OK了    但是...嗚嗚~~~又有另外一個問題了,
在Client的OnClose會呼叫Server的DelUser()的Method,
DelUser只是填入Client的Logout時間這一個動作而已
 
Client程式

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DCOMConnection1.AppServer.DelUser(StrToInt(VarToStr(AutoID)));
end;     
Server的DelUser程式    procedure TMISAPSvr.DelUser(AutoID: Integer);
begin
  with frmMain.adoLogin do
  begin
    if Not Active then Open;
    if Locate('AutoID', AutoID, []) then
    begin
      Edit;
      FieldByName('LogoutDT').AsDateTime := Now;
      Post;
      _UpdateShow;
    end;
  end;
end;    問題如下
ClientA 登入,ClientB 再登入,
然後ClientA 先離開,ClientB 再離開沒問題,
但是ClientB 先離開,ClientA 再離開會出現如下
錯誤訊息:
Missing Connection or Connection String
那是哪一行出現錯誤,你Debug Server程式看看。這好像是你的ADO要Open,卻沒有Connection or Connection String。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#20 引用回覆 回覆 發表時間:2002-11-05 14:12:42 IP:61.58.xxx.xxx 未訂閱
引言:
引言: 那是哪一行出現錯誤,你Debug Server程式看看。這好像是你的ADO要Open,卻沒有Connection or Connection String。
那是哪一行出現錯誤,你Debug Server程式看看 => 是出現在Client的DCOMConnection1.AppServer.DelUser(StrToInt(VarToStr(AutoID))); 這一行 這好像是你的ADO要Open,卻沒有Connection or Connection String => 是的 說也奇怪第一個Client離開沒問題,但似乎在第一個Client離開後, ADOQuery的Connection會不見,所以我在ADOQurey的Open之前先 判斷若沒有Connection就將Connection指定進出,就ok了,但這樣 做好像很奇怪
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#21 引用回覆 回覆 發表時間:2002-11-05 15:10:23 IP:203.204.xxx.xxx 未訂閱
引言: 那是哪一行出現錯誤,你Debug Server程式看看 => 是出現在Client的DCOMConnection1.AppServer.DelUser(StrToInt(VarToStr(AutoID))); 這一行 這好像是你的ADO要Open,卻沒有Connection or Connection String => 是的 說也奇怪第一個Client離開沒問題,但似乎在第一個Client離開後, ADOQuery的Connection會不見,所以我在ADOQurey的Open之前先 判斷若沒有Connection就將Connection指定進出,就ok了,但這樣 做好像很奇怪
你這是Debug Client,Debug Server請在Delphi執行Server程式,然後由檔案總管執行Client。 嗯!這我就不是很清楚了,因為我是用BDE,沒有類似問題。 也許是你的Server流程有問題,你的Connection是設固定還是動態指定。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
wuabc
初階會員


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

發送簡訊給我
#22 引用回覆 回覆 發表時間:2002-11-05 23:07:10 IP:203.204.xxx.xxx 未訂閱
引言: 說也奇怪第一個Client離開沒問題,但似乎在第一個Client離開後, ADOQuery的Connection會不見,所以我在ADOQurey的Open之前先 判斷若沒有Connection就將Connection指定進出,就ok了,但這樣 做好像很奇怪
試試調整ADOQuery參數設定看看,再不然可考慮更新ADO版本試試看囉! Sorry, ADO不熟幫不上忙 Ted Wu
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#23 引用回覆 回覆 發表時間:2002-11-06 11:09:07 IP:61.58.xxx.xxx 未訂閱
非常感謝各位前輩不厭其煩的指導小弟, 小弟今天又試了ADOQuery.Append的情形, 引數可能有類型錯誤,或超過可接受的範圍,或與其它引數衝突。 的情況居然又不會出現了,都正常,這這這... 再次感謝各位前的熱心指導,謝謝,謝謝
系統時間:2024-03-28 22:09:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!