ClientDataSet.PacketRecords與ApplyUpdates的錯誤... |
缺席
|
ESCAPE
一般會員 發表:37 回覆:47 積分:16 註冊:2005-02-15 發送簡訊給我 |
請問有經驗的前輩,
如果TClientDataSet.PacketRecords>0,當TClientDataSet.ApplyUpdates(0)的時候會出現以下錯誤訊息: Remote error: SQL State:HY000,SQL Error Code:0 連線正忙碌於另一命令結果 可是TClientDataSet.PacketRecords=-1就沒問題。 是否有前輩遇到這樣的問題?目前雖然資料量才二千多筆,所以程式開啟後帶回全部資料,但考慮到未來資料筆數成長問題,所以希望每次程式開啟不要帶出所有的資料量。煩請有經驗的前輩不吝指教,謝謝! |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
也許是資料庫在 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 發送簡訊給我 |
很感謝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
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
奇怪的問題是因為【有狀態的設計法】:
不只要考慮 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 發送簡訊給我 |
很謝謝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
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
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
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
简单来说,就是每次读取少许记录,但一次读完。
也就是说,在服务器端的 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 等等东西,不需要等待了。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |