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

無狀態對象更新後如何保持client同server游標一致

尚未結案
wuherong2000
一般會員


發表:26
回覆:21
積分:9
註冊:2003-06-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-08 16:09:37 IP:218.16.xxx.xxx 未訂閱
我在服務端寫了如下程式 子程式下面程式將調用 procedure TYDD.MyApply(ProdData: OleVariant; var DeltaData: OleVariant); var   ErrorCount: integer;   OwnerData: OleVariant; begin   if not VarIsNull(DeltaData) then   begin     DeltaData := (IDispatch(ProdData[0]) as       IAppServer).AS_ApplyUpdates(ProdData[1], DeltaData, 0,        ErrorCount, OwnerData);     if ErrorCount > 0 then       abort;   end; end; 客戶端實際上調用的服務囂端程式,用到上面的程式 procedure TYDD.MyApplyData(Prod: OleVariant; var Delta: OleVariant;   var RtnStr: WideString); type   PDataset = ^FDataset;   FDataset = array[0..1000] of OleVariant; var   p: PDataset;   i: integer; begin   ADOConnection1.BeginTrans;   try     p := VarArrayLock(Delta);     try       for i := VarArrayLowBound(Delta, 1) to VarArrayHighBound(Delta, 1) do         MyApply(Prod[i], p^[i]);     finally       VarArrayUnLock(Delta);     end;     ADOConnection1.CommitTrans;     RtnStr := EmptyStr;   except     ADOConnection1.RollbackTrans;     RtnStr := ErrorStr;   end; end;    我在客戶端如下調用一次正常,二次就不能更新了 function TForm1.saveCommit(): boolean; var   Delta, Prod: OleVariant;   ErrStr: string; begin   result := false;      Delta := VarArrayCreate([0, 1], VarVariant);   if adoqM.ChangeCount > 0 then     Delta[0] := adoqM.Delta   else     Delta[0] := null;      if adoqD.ChangeCount > 0 then     Delta[1] := adoqD.Delta   else     Delta[1] := null;      Prod := VarArrayCreate([0, 1], VarVariant);   Prod[0] := VarArrayof([adoqM.AppServer, adoqM.ProviderName]);   Prod[1] := VarArrayof([adoqD.AppServer, adoqD.ProviderName]);      DCOMConnection1.AppServer.MyApplyData(Prod, Delta, ErrStr);   if ErrStr = EmptyStr then result := true; end;    原因是由於更新後客戶端的adoqM.delta與adoqD.delta沒有同服務囂一致 更新後這兩個緩沖應該無數據的,delphi7用applyupdate()是調用下面的程 式來實現的 function TCustomClientDataSet.DoApplyUpdates(Delta: OleVariant; MaxErrors: Integer;   out ErrorCount: Integer): OleVariant; var   OwnerData: OleVariant; begin   DoBeforeApplyUpdates(OwnerData);   Result := AppServer.AS_ApplyUpdates(ProviderName, Delta, MaxErrors, ErrorCount, OwnerData);   DoAfterApplyUpdates(OwnerData); end;    通過DoAfterApplyUpdates(OwnerData);來實現緩存區清空的可是在我的程式中 相應部份 if not VarIsNull(DeltaData) then   begin     DeltaData := (IDispatch(ProdData[0]) as       IAppServer).AS_ApplyUpdates(ProdData[1], DeltaData, 0,        ErrorCount, OwnerData);        //這裡應該怎麼寫呢,請賜教     if ErrorCount > 0 then       abort;   end;
jieshu
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-11 19:26:26 IP:203.204.xxx.xxx 未訂閱
引言: 原因是由於更新後客戶端的adoqM.delta與adoqD.delta沒有同服務囂一致 更新後這兩個緩沖應該無數據的,delphi7用applyupdate()是調用下面的程 式來實現的 function TCustomClientDataSet.DoApplyUpdates(Delta: OleVariant; MaxErrors: Integer; out ErrorCount: Integer): OleVariant; var OwnerData: OleVariant; begin DoBeforeApplyUpdates(OwnerData); Result := AppServer.AS_ApplyUpdates(ProviderName, Delta, MaxErrors, ErrorCount, OwnerData); DoAfterApplyUpdates(OwnerData); end; 通過DoAfterApplyUpdates(OwnerData);來實現緩存區清空的可是在我的程式中 相應部份 if not VarIsNull(DeltaData) then begin DeltaData := (IDispatch(ProdData[0]) as IAppServer).AS_ApplyUpdates(ProdData[1], DeltaData, 0, ErrorCount, OwnerData); //這裡應該怎麼寫呢,請賜教 if ErrorCount > 0 then abort; end;
太長了,沒有空慢慢看,清Log應該是ClientDataSet1.MergeChangeLog,你的錯誤訊息是什麼,有可能是時間或浮點欄位精準度問題。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
wuherong2000
一般會員


發表:26
回覆:21
積分:9
註冊:2003-06-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-15 08:15:19 IP:218.16.xxx.xxx 未訂閱
>有可能是時間或浮點欄位精準度問題。 如果是時間精度的問題怎麼辦呢,因為我有部份程式是用的datetime類型,原來用二層可以更新,可是用三層卻更新不了,說是原記錄已被其它人修改,用sql profiler跟蹤發現是時間的問題產生的語句應該是按以下更新的: update onetable set tt=Att where tt=btt and adatetime='sometime' 其中sometime沒包括毫秒的部份結果就找不到記錄了,這樣的話應該怎麼辦呢
jieshu
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-15 19:08:26 IP:203.204.xxx.xxx 未訂閱
引言: >有可能是時間或浮點欄位精準度問題。 如果是時間精度的問題怎麼辦呢,因為我有部份程式是用的datetime類型,原來用二層可以更新,可是用三層卻更新不了,說是原記錄已被其它人修改,用sql profiler跟蹤發現是時間的問題產生的語句應該是按以下更新的: update onetable set tt=Att where tt=btt and adatetime='sometime' 其中sometime沒包括毫秒的部份結果就找不到記錄了,這樣的話應該怎麼辦呢
有回答過了,你可用錯誤訊息找找看,大概就是截到秒再存,已存入的下SQL去截,或者不要將DateTime欄位加入Where條件內。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
wuherong2000
一般會員


發表:26
回覆:21
積分:9
註冊:2003-06-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-06 07:48:56 IP:218.16.xxx.xxx 未訂閱
有參照嗎?請給我一連接好不好
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-06 13:43:31 IP:211.20.xxx.xxx 未訂閱
關於時間精度的問題,小弟之前也曾遇過。 後來查詢 SQL Server 2000 的說明之後發現,在 SQL Server 7 以及 2000 中,DateTime 型態的精度是 1/300 秒 而 Delphi 中 TDateTime 的精度是 1/1000 秒,所以就出現了誤差 所以存時間相關的欄位時,都截至秒,這樣就沒有問題了 依照微軟的說法,新版的 SQL Server 會有一個新的型態,支援到 1/1000 秒的精度。不過呢,需要為了這個型態而更新 SQL Server 嗎?未必吧! 用字串來存時間也可以啊:FormatDateTime('YYYYMMDDHHNNSS.ZZZ', Now) 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
jieshu
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-06 18:52:06 IP:203.204.xxx.xxx 未訂閱
引言: 有參照嗎?請給我一連接好不好
【問題】奇怪!!!!!!!!!!用ADO不行,用ODBC就可以?why?Applyupdates(0) http://delphi.ktop.com.tw/topic.php?topic_id=28663
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Ktop_Robot
站務副站長


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

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


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


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


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

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