無狀態對象更新後如何保持client同server游標一致 |
尚未結案
|
wuherong2000
一般會員 發表:26 回覆:21 積分:9 註冊:2003-06-16 發送簡訊給我 |
我在服務端寫了如下程式
子程式下面程式將調用
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 發送簡訊給我 |
引言: 原因是由於更新後客戶端的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.taconet.com.tw/jieshu/ |
||
wuherong2000
一般會員 發表:26 回覆:21 積分:9 註冊:2003-06-16 發送簡訊給我 |
|||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: >有可能是時間或浮點欄位精準度問題。 如果是時間精度的問題怎麼辦呢,因為我有部份程式是用的datetime類型,原來用二層可以更新,可是用三層卻更新不了,說是原記錄已被其它人修改,用sql profiler跟蹤發現是時間的問題產生的語句應該是按以下更新的: update onetable set tt=Att where tt=btt and adatetime='sometime' 其中sometime沒包括毫秒的部份結果就找不到記錄了,這樣的話應該怎麼辦呢有回答過了,你可用錯誤訊息找找看,大概就是截到秒再存,已存入的下SQL去截,或者不要將DateTime欄位加入Where條件內。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
wuherong2000
一般會員 發表:26 回覆:21 積分:9 註冊:2003-06-16 發送簡訊給我 |
|||
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
關於時間精度的問題,小弟之前也曾遇過。
後來查詢 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 發送簡訊給我 |
引言: 有參照嗎?請給我一連接好不好【問題】奇怪!!!!!!!!!!用ADO不行,用ODBC就可以?why?Applyupdates(0) http://delphi.ktop.com.tw/topic.php?topic_id=28663
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |