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

請問TClientdataset之問題

尚未結案
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-07 12:42:00 IP:211.74.xxx.xxx 未訂閱
請問若我在Server中使用TADOQUERY 在Client端執行 TCLientDataSet1.commandtext:='Select * from A where type1=''1'' ' TCLientDataSet1.open; TCLientDataSet2.commandtext:='Select * from A where type1=''1'' ' TCLientDataSet2.open; 其中 TCLientDataSet1與TCLientDataSet2同時指向TADOQUERY 請問TCLientDataSet1,TCLientDataSet2同時open其會或互相干擾嗎? 為何我執行時,有時候可以,有時會出現 A:cannot perform this operation on an open dataset 之訊息 請問如何改善 謝謝
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-07 13:35:13 IP:211.74.xxx.xxx 未訂閱
引言: 請問若我在Server中使用TADOQUERY 在Client端執行 TCLientDataSet1.clsoe; TCLientDataSet1.commandtext:='Select * from A where type1=''1'' ' TCLientDataSet1.open; TCLientDataSet2.clsoe; TCLientDataSet2.commandtext:='Select * from A where type1=''1'' ' TCLientDataSet2.open; 其中 TCLientDataSet1與TCLientDataSet2同時指向TADOQUERY 請問TCLientDataSet1,TCLientDataSet2同時open其會或互相干擾嗎? 為何我執行時,有時候可以,有時會出現 A:cannot perform this operation on an open dataset 之訊息 請問如何改善 謝謝
試試看加上面紅色那一行 ~悠遊法國號~
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-11 11:03:45 IP:211.74.xxx.xxx 未訂閱
情況一樣, 因為TCLientDataSet是runtime時產生,其程式有下close。 謝謝      
引言:
引言: 請問若我在Server中使用TADOQUERY 在Client端執行 TCLientDataSet1.clsoe; TCLientDataSet1.commandtext:='Select * from A where type1=''1'' ' TCLientDataSet1.open; TCLientDataSet2.clsoe; TCLientDataSet2.commandtext:='Select * from A where type1=''1'' ' TCLientDataSet2.open; 其中 TCLientDataSet1與TCLientDataSet2同時指向TADOQUERY 請問TCLientDataSet1,TCLientDataSet2同時open其會或互相干擾嗎? 為何我執行時,有時候可以,有時會出現 A:cannot perform this operation on an open dataset 之訊息 請問如何改善 謝謝
試試看加上面紅色那一行 ~悠遊法國號~
jieshu
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-11 12:32:00 IP:203.204.xxx.xxx 未訂閱
引言: 請問若我在Server中使用TADOQUERY TCLientDataSet1與TCLientDataSet2同時指向TADOQUERY 請問TCLientDataSet1,TCLientDataSet2同時open其會或互相干擾嗎? 為何我執行時,有時候可以,有時會出現 A:cannot perform this operation on an open dataset 之訊息
共用作為查詢且PacketRecords為-1,使用上是沒有任何問題的,你的錯誤訊息是指DataSet已經Open,你又做了些不可變更屬性的動作,你可Debug看看是由哪行發出錯誤訊息。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-14 12:29:50 IP:211.74.xxx.xxx 未訂閱
共用作為非做為查詢,而是兩個TClientDateset同時指向TADOQUERY,其中TClientDateset之CommandText語法是不一樣的 且PacketRecords設為100 請問會有影響嗎? 謝謝    
引言:
引言: 請問若我在Server中使用TADOQUERY TCLientDataSet1與TCLientDataSet2同時指向TADOQUERY 請問TCLientDataSet1,TCLientDataSet2同時open其會或互相干擾嗎? 為何我執行時,有時候可以,有時會出現 A:cannot perform this operation on an open dataset 之訊息
共用作為查詢且PacketRecords為-1,使用上是沒有任何問題的,你的錯誤訊息是指DataSet已經Open,你又做了些不可變更屬性的動作,你可Debug看看是由哪行發出錯誤訊息。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
jieshu
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-14 17:23:50 IP:203.204.xxx.xxx 未訂閱
引言: 共用作為非做為查詢,而是兩個TClientDateset同時指向TADOQUERY,其中TClientDateset之CommandText語法是不一樣的 且PacketRecords設為100 請問會有影響嗎? 謝謝
我用TQuery測試過,如果會更新資料,共用DataSetProvider和Query的話,就會有干擾,出現錯誤,僅做查詢則不會。 PacketRecords不是-1好像Server會記錄目前資料取得位置,所以共用的話可能會錯亂吧,我是沒測試過。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-15 10:46:31 IP:61.229.xxx.xxx 未訂閱
你的問題在於TClientDataSet1.PacketRecord設為100. 如果你要讓ApServer的ADOQuery給各Client端共用,那麼,ApServer就必需為無狀態物件,換言之,每個client端對ApServer所下達的SQL指令,ADOQuery執行SQL指令取得DataSet之後就必需把資料全部傳回Client端,這時,ApServer可以看成完成一次client端的請求工作,然後等著另一次的client再下達sql指令. 如果你的TClientDataset.PacketRecord設為100,那表示這個ADOQuery必需為狀態物件,他必需記得這個client下了一道SQL指令,且每次只傳回100筆資料,到目前為止已回傳幾筆了.換言之,這個ADOQuery在沒有把該SQL指令的資料全部回傳給client之前,是不能再接受其他client端命令請求的.要做到這樣的效果,必需要再另外寫程式記錄處理,以確保同一個ADOQuery不會同時被兩個client端呼叫,否則就會出現你現在的狀況,兩個client端互相干擾. 通常,為了讓ApServer可以有比較好的perfermance,也為了讓系統架構比較簡單,我都會讓ApServer為無狀態物件.可以把client端每次對ApServer所下的命令都當成是一個不可切割的時間單位,client端依據SD的規劃,向ApServer下SQL指令讀取必需要的資料,方便使用者操作以達成程式目的. ApServer是無狀態除了可以有比較好的perfermance之外,也可以進一步做到poolering的效果,可大大增加ApServer的效能. 給您做個參考
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-18 12:00:14 IP:211.74.xxx.xxx 未訂閱
我已將TClientDataSet1.PacketRecord:=-1 狀況一樣 謝謝    
引言: 你的問題在於TClientDataSet1.PacketRecord設為100. 如果你要讓ApServer的ADOQuery給各Client端共用,那麼,ApServer就必需為無狀態物件,換言之,每個client端對ApServer所下達的SQL指令,ADOQuery執行SQL指令取得DataSet之後就必需把資料全部傳回Client端,這時,ApServer可以看成完成一次client端的請求工作,然後等著另一次的client再下達sql指令. 如果你的TClientDataset.PacketRecord設為100,那表示這個ADOQuery必需為狀態物件,他必需記得這個client下了一道SQL指令,且每次只傳回100筆資料,到目前為止已回傳幾筆了.換言之,這個ADOQuery在沒有把該SQL指令的資料全部回傳給client之前,是不能再接受其他client端命令請求的.要做到這樣的效果,必需要再另外寫程式記錄處理,以確保同一個ADOQuery不會同時被兩個client端呼叫,否則就會出現你現在的狀況,兩個client端互相干擾. 通常,為了讓ApServer可以有比較好的perfermance,也為了讓系統架構比較簡單,我都會讓ApServer為無狀態物件.可以把client端每次對ApServer所下的命令都當成是一個不可切割的時間單位,client端依據SD的規劃,向ApServer下SQL指令讀取必需要的資料,方便使用者操作以達成程式目的. ApServer是無狀態除了可以有比較好的perfermance之外,也可以進一步做到poolering的效果,可大大增加ApServer的效能. 給您做個參考
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-18 12:57:00 IP:61.222.xxx.xxx 未訂閱
有沒有試著追蹤一下,出現"cannot perform this operation on an open dataset"訊息的地方是在那裡?如果可以的話,把程式碼POST出來大家一起找,也許會比較快找到答案
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-04-30 13:44:52 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-02 8:19:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!