全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3397
推到 Plurk!
推到 Facebook!

ClientDataSet.PacketRecords與ApplyUpdates的錯誤...

缺席
ESCAPE
一般會員


發表:37
回覆:47
積分:16
註冊:2005-02-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-02-03 17:29:12 IP:59.127.xxx.xxx 訂閱
請問有經驗的前輩,
如果TClientDataSet.PacketRecords>0,當TClientDataSet.ApplyUpdates(0)的時候會出現以下錯誤訊息:
Remote error: SQL State:HY000,SQL Error Code:0 連線正忙碌於另一命令結果
可是TClientDataSet.PacketRecords=-1就沒問題。
是否有前輩遇到這樣的問題?目前雖然資料量才二千多筆,所以程式開啟後帶回全部資料,但考慮到未來資料筆數成長問題,所以希望每次程式開啟不要帶出所有的資料量。煩請有經驗的前輩不吝指教,謝謝!
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-02-04 09:47:28 IP:59.120.xxx.xxx 未訂閱
也許是資料庫在 Select 時也下了 Transaction (個人猜測)
因為沒有全部下載完成,所以 Transaction 一直沒有結束,造成更新時的錯誤

如果希望每次程式開啟時不要帶回所有的資料量,何不從 Client 端的 SQL 改起呢?
===================引 用 ESCAPE 文 章===================
請問有經驗的前輩,
如果TClientDataSet.PacketRecords>0,當TClientDataSet.ApplyUpdates(0)的時候會出現以下錯誤訊息:
Remote error: SQL State:HY000,SQL Error Code:0 連線正忙碌於另一命令結果
可是TClientDataSet.PacketRecords=-1就沒問題。
是否有前輩遇到這樣的問題?目前雖然資料量才二千多筆,所以程式開啟後帶回全部資料,但考慮到未來資料筆數成長問題,所以希望每次程式開啟不要帶出所有的資料量。煩請有經驗的前輩不吝指教,謝謝!
ESCAPE
一般會員


發表:37
回覆:47
積分:16
註冊:2005-02-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-02-04 13:20:00 IP:211.23.xxx.xxx 訂閱
很感謝GrandRURU大大的回覆!
經在網路上不斷的搜索在CSDN看到一篇同樣的問題,
大陸網友提供一個很奇怪的辦法,就是在TClientDataSet.ApplyUpdates之前先Last,
這個做法確實沒問題。但這樣就很奇怪了,如果TClientDataSet.PacketRecords=10,每次傳回10筆資料,但所有的資料有100筆,剩下的90筆資料還在DataSnap Server端,使用者修改第五筆資料,在ApplyUpdates之前先Last,也就是將100筆資料全部撈回來,這樣才可以修改資料。
如果是這樣的話似乎沒必要設定TClientDataSet.PacketRecord,使用Select TOP 10就可以了...

我會設定TClientDataSet.PacketRecords是因為參考捷康科技發行的DataSnap書籍(作者應是李維老師),
因公司計畫需要,剛接觸DataSnap的程式,有很多地方都還在摸索中,發現DataSnap好像有很多奇怪的問題啊...現在可以理解GrandRURU大大上次在另一篇說跳火坑的意思了。

===================引 用 GrandRURU 文 章===================
也許是資料庫在 Select 時也下了 Transaction (個人猜測)
因為沒有全部下載完成,所以 Transaction 一直沒有結束,造成更新時的錯誤

如果希望每次程式開啟時不要帶回所有的資料量,何不從 Client 端的 SQL 改起呢?
===================引 用 ESCAPE 文 章===================
請問有經驗的前輩,
如果TClientDataSet.PacketRecords>0,當TClientDataSet.ApplyUpdates(0)的時候會出現以下錯誤訊息:
Remote error: SQL State:HY000,SQL Error Code:0 連線正忙碌於另一命令結果
可是TClientDataSet.PacketRecords=-1就沒問題。
是否有前輩遇到這樣的問題?目前雖然資料量才二千多筆,所以程式開啟後帶回全部資料,但考慮到未來資料筆數成長問題,所以希望每次程式開啟不要帶出所有的資料量。煩請有經驗的前輩不吝指教,謝謝!
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-02-04 14:34:08 IP:59.120.xxx.xxx 未訂閱
奇怪的問題是因為【有狀態的設計法】:
不只要考慮 Client 端的狀態,還必須考慮到 DataSnap 端的狀態

你所看到的解法,全都是在解除「DataSnap 的狀態」,在沒有搞清楚 DataSnap 的架構下,進行專案是很危險的
回歸到源頭,最快的解決辦法就是用「無狀態」的設計方法處理
如果要以「有狀態」的設計持續下去,建議你再把官方的手冊多看幾次,流程搞懂了,便清楚為什麼會出錯了。

以上
===================引 用 ESCAPE 文 章=================== 很感謝GrandRURU大大的回覆!
經在網路上不斷的搜索在CSDN看到一篇同樣的問題,
大陸網友提供一個很奇怪的辦法,就是在TClientDataSet.ApplyUpdates之前先Last,
這個做法確實沒問題。但這樣就很奇怪了,如果TClientDataSet.PacketRecords=10,每次傳回10筆資料,但所有的資料有100筆,剩下的90筆資料還在DataSnap Server端,使用者修改第五筆資料,在ApplyUpdates之前先Last,也就是將100筆資料全部撈回來,這樣才可以修改資料。
如果是這樣的話似乎沒必要設定TClientDataSet.PacketRecord,使用Select TOP 10就可以了...

我會設定TClientDataSet.PacketRecords是因為參考捷康科技發行的DataSnap書籍(作者應是李維老師),
因公司計畫需要,剛接觸DataSnap的程式,有很多地方都還在摸索中,發現DataSnap好像有很多奇怪的問題啊...現在可以理解GrandRURU大大上次在另一篇說跳火坑的意思了。

ESCAPE
一般會員


發表:37
回覆:47
積分:16
註冊:2005-02-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-02-05 16:14:28 IP:59.127.xxx.xxx 訂閱
很謝謝GrandRURU大大的指教。
不可否認,當初使用DataSnap確實因為計劃的需要,遇到天兵想法的公務員,要求兩個月完成系統並且驗收。
系統必須開發APP,資料傳到後端資料庫,所以只好趕鴨子上架了。
再請教GrandRURU大大,能否請您說明無狀態、有狀態的意思。
在此先謝謝GrandRURU大大的指教。
===================引 用 GrandRURU 文 章===================
奇怪的問題是因為【有狀態的設計法】:
不只要考慮 Client 端的狀態,還必須考慮到 DataSnap 端的狀態

你所看到的解法,全都是在解除「DataSnap 的狀態」,在沒有搞清楚 DataSnap 的架構下,進行專案是很危險的
回歸到源頭,最快的解決辦法就是用「無狀態」的設計方法處理
如果要以「有狀態」的設計持續下去,建議你再把官方的手冊多看幾次,流程搞懂了,便清楚為什麼會出錯了。

以上
===================引 用 ESCAPE 文 章=================== 很感謝GrandRURU大大的回覆!
經在網路上不斷的搜索在CSDN看到一篇同樣的問題,
大陸網友提供一個很奇怪的辦法,就是在TClientDataSet.ApplyUpdates之前先Last,
這個做法確實沒問題。但這樣就很奇怪了,如果TClientDataSet.PacketRecords=10,每次傳回10筆資料,但所有的資料有100筆,剩下的90筆資料還在DataSnap Server端,使用者修改第五筆資料,在ApplyUpdates之前先Last,也就是將100筆資料全部撈回來,這樣才可以修改資料。
如果是這樣的話似乎沒必要設定TClientDataSet.PacketRecord,使用Select TOP 10就可以了...

我會設定TClientDataSet.PacketRecords是因為參考捷康科技發行的DataSnap書籍(作者應是李維老師),
因公司計畫需要,剛接觸DataSnap的程式,有很多地方都還在摸索中,發現DataSnap好像有很多奇怪的問題啊...現在可以理解GrandRURU大大上次在另一篇說跳火坑的意思了。

GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-02-10 02:42:58 IP:211.79.xxx.xxx 未訂閱
Jasonwang 版主已經有把無狀態、有狀態講得很明白囉

請參閱:http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=106682#10



===================引 用 ESCAPE 文 章===================

很謝謝GrandRURU大大的指教。

不可否認,當初使用DataSnap確實因為計劃的需要,遇到天兵想法的公務員,要求兩個月完成系統並且驗收。

系統必須開發APP,資料傳到後端資料庫,所以只好趕鴨子上架了。

再請教GrandRURU大大,能否請您說明無狀態、有狀態的意思。

在此先謝謝GrandRURU大大的指教。
編輯記錄
GrandRURU 重新編輯於 2016-02-10 02:43:32, 註解 無‧
pcplayer99
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-03-13 13:30:41 IP:120.236.xxx.xxx 訂閱
简单来说,就是每次读取少许记录,但一次读完。

也就是说,在服务器端的 SQL 类似: select top 10 * from yourTable where ID >0;

客户端的 ClientDataSet Open 就只取到10条,并且是取完了。不影响你 ApplyUpdates。

如果你在客户端需要连续的 100000 条,自己稍微麻烦一点,多写一些 code。办法是:

1. 增加一个 ClientDataSet2;
2. ClientDataSet2 对应的服务器端的 SQL:select top 10 * from yourTable where ID >:ID。在客户端的 ClientDataSet2,鼠标右键点,拉下 menu,选择 Fetch paramters。它就有了一个 parameter 叫做 ID。
3. ClientDataSet2.Params[0].Value := 0;
ClientDataSet2.Open;
ClientDataSet1.AppendData(ClientDataSet2.Data);
ClientDataSet2.Last;
TempID := ClientDataSet2.FieldByName('ID').ASInteger;
ClientDataSet2.Close;
ClientdataSet2.Params[0].Value := TempID;
ClientDataSet2.Open; //这里取到第二批
ClientDataSet1.AppendData(ClientDataSet2.Data);


大致就是这样,循环读取。你可以开个线程在后面慢慢跑。不过要注意 ClientDataSet1.AppendData 这句要加上线程同步因为你的 ClientDataSet1 的动作会影响你的 Form 上的显示。

这样,用户就可以随时操作 ClientDataSet1 对应的 DBGrid 等等东西,不需要等待了。
系統時間:2017-11-19 22:14:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!