請問TClientdataset之問題 |
尚未結案
|
shing.net
中階會員 發表:207 回覆:124 積分:66 註冊:2002-03-16 發送簡訊給我 |
請問若我在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 發送簡訊給我 |
引言: 請問若我在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 發送簡訊給我 |
情況一樣,
因為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 發送簡訊給我 |
引言: 請問若我在Server中使用TADOQUERY TCLientDataSet1與TCLientDataSet2同時指向TADOQUERY 請問TCLientDataSet1,TCLientDataSet2同時open其會或互相干擾嗎? 為何我執行時,有時候可以,有時會出現 A:cannot perform this operation on an open dataset 之訊息共用作為查詢且PacketRecords為-1,使用上是沒有任何問題的,你的錯誤訊息是指DataSet已經Open,你又做了些不可變更屬性的動作,你可Debug看看是由哪行發出錯誤訊息。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
shing.net
中階會員 發表:207 回覆:124 積分:66 註冊:2002-03-16 發送簡訊給我 |
共用作為非做為查詢,而是兩個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看看是由哪行發出錯誤訊息。 |
||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 共用作為非做為查詢,而是兩個TClientDateset同時指向TADOQUERY,其中TClientDateset之CommandText語法是不一樣的 且PacketRecords設為100 請問會有影響嗎? 謝謝我用TQuery測試過,如果會更新資料,共用DataSetProvider和Query的話,就會有干擾,出現錯誤,僅做查詢則不會。 PacketRecords不是-1好像Server會記錄目前資料取得位置,所以共用的話可能會錯亂吧,我是沒測試過。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
你的問題在於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 發送簡訊給我 |
我已將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 發送簡訊給我 |
|||
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |