在做mts/com+時,我用協調對像對進行更新數據時出現以下的錯誤: |
尚未結案
|
weixubin
一般會員 發表:30 回覆:14 積分:8 註冊:2003-02-20 發送簡訊給我 |
在做mts/com+時,我用協調對像對進行更新數據時出現以下的錯誤: {協調對像}
環境:需要事務
代碼:
destructor TMtsUpdateCoor.Destroy;
begin
inherited;
FDM.Free;
end; procedure TMtsUpdateCoor.Initialize;
begin
inherited;
FDM := TfmDMUpdateCoor.Create(Forms.Application);
end; procedure TMtsUpdateCoor.UpdateDjDwzl(vDatas: OleVariant;
iMaxError: Integer; var iErrorCount: Integer);
begin
try
FDM.DjDwzlDCom.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount);
SetComplete;
except
SetAbort;
end;
end;
{客戶端}
MtsUpdateObj.UpdateDjDwzl(ClientDataSet.Data,0, AErrorCount);//每次在這裏會調用會出現以下錯誤. =========================
同是炎黄子孙
| ||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: {客戶端} MtsUpdateObj.UpdateDjDwzl(ClientDataSet.Data,0, AErrorCount);//每次在這裏會調用會出現以下錯誤. ========================= 同是炎黄子孙看錯誤訊息好像是Client和Server還沒連上線或找不到相關的Function。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: 在做mts/com 時,我用協調對像對進行更新數據時出現以下的錯誤: procedure TMtsUpdateCoor.Initialize; begin inherited; FDM := TfmDMUpdateCoor.Create(Forms.Application); //FDM := TfmDMUpdateCoor.Create(Self);<==改用Self試試,畢竟COM 跟一般Application 不同未必會initialize Application FDM.DjDwzlDCom.Connected := True;// end; procedure TMtsUpdateCoor.UpdateDjDwzl(vDatas: OleVariant; iMaxError: Integer; var iErrorCount: Integer); begin try FDM.DjDwzlDCom.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount); SetComplete; except SetAbort; end; end; {客戶端} ========================= 同是炎黄子孙我並未看到你在Server端程式中呼叫 Initialize,我假設你已經在OnCreate 能否說明FDM.DjDwzlDCom 是啥東西?是DCom Connection嗎? 我猜你程式碼的目的應該要透過協調物件轉call其他Com 元件 用DCOm是一種方法,你也可直接叫用Interface 假設你DjDwzlDCom 所連接的元件為TDjDwz 那協調物件可改寫為 uses ...,DjDwz_TLB,...; ... procedure TMtsUpdateCoor.UpdateDjDwzl(vDatas: OleVariant; iMaxError: Integer; var iErrorCount: Integer); var inft:IDjDwz; begin try inft := CoDjDwz.Create; inft.UpdateDatas(vDatas, iMaxError, iErrorCount); inft := nil; SetComplete; except SetAbort; end; end;混心雜欲 棄修身~唉
------
唉~ |
||
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
|||
weixubin
一般會員 發表:30 回覆:14 積分:8 註冊:2003-02-20 發送簡訊給我 |
我並未看到你在Server端程式中呼叫 Initialize,我假設你已經在OnCreate
能否說明FDM.DjDwzlDCom 是啥東西?是DCom Connection嗎?
我猜你程式碼的目的應該要透過協調物件轉call其他Com+元件
用DCOm是一種方法,你也可直接叫用Interface
假設你DjDwzlDCom 所連接的元件為TDjDwz
那協調物件可改寫為
uses ...,DjDwz_TLB,...; ... procedure TMtsUpdateCoor.UpdateDjDwzl(vDatas: OleVariant; iMaxError: Integer; var iErrorCount: Integer); var inft:IDjDwz; begin try inft := CoDjDwz.Create; inft.UpdateDatas(vDatas, iMaxError, iErrorCount); inft := nil; SetComplete; except SetAbort; end; end;混心雜欲 棄修身~唉 [/quote] 現在發現更新不了數據庫.... 我用李维的 |
||
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: 現在發現更新不了數據庫.... 我用李维的那表示執行FMyDM.dcomcPublishers.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount);出錯 原因為 1.呼叫前未將FMyDM.dcomcPublishers 建立或FMyDM.dcomcPublishers.Connected= True 2.dcomcPublishers.AppServer.UpdateDatas內容寫錯,請先撰寫測試程式直接由客戶呼叫dcomcPublishers.AppServer.UpdateDatas,測試是否可正常異動資料庫 混心雜欲 棄修身~唉
------
唉~ |
||
weixubin
一般會員 發表:30 回覆:14 積分:8 註冊:2003-02-20 發送簡訊給我 |
[/quote]
那表示執行FMyDM.dcomcPublishers.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount);出錯
原因為
1.呼叫前未將FMyDM.dcomcPublishers 建立或FMyDM.dcomcPublishers.Connected= True
2.dcomcPublishers.AppServer.UpdateDatas內容寫錯,請先撰寫測試程式直接由客戶呼叫dcomcPublishers.AppServer.UpdateDatas,測試是否可正常異動資料庫 混心雜欲 棄修身~唉
[/quote]
还是不行呀,我试过好几次了。你有没有做成功过呢,如有现成例子能不能借来参考一下,已经搞了很长时间了,一点办法都没有了 =========================
同是炎黄子孙
|
||
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: 还是不行呀,我试过好几次了。你有没有做成功过呢,如有现成例子能不能借来参考一下,已经搞了很长时间了,一点办法都没有了 同是炎黄子孙放心我目前開發的分散式系統採用COM+架構有協調,資料維護,系統等元件相互合作,運作正常,不過程式架構不能給你參考,我另外簡單設計一個範例你試試看 http://delphi.ktop.com.tw/loadfile.php?TOPICID=12764779&CC=285481 說明: /*前言*/ 本範例程式的目的用來展試示COM+元件式交易的寫法,如何透過協調物件來控制交易達到重用物件的目的 為盡量簡化程式,訂單採用單表(非master/detail) 請勿來信跟我討論說本範例設計情境不實用,或用MIDAS原本架構有更好的作法等等非主題性問題 透過本範例應該可以了解到如果對Server端元件作適當分割的話,的確採用COM+元件跟本不須撰寫任何資料庫交易的控制程式碼 /*設計情境說明*/ 1.需求 在修改訂單時,必須要檢查目前的庫存量是否足夠,否則令該次訂單修改失敗,以確保能夠順利出貨 2.Server Tier 設計 Server 端主要由訂單元件(Order,支援交易) ,庫存元件(WareHouse,支援交易),協調元件(Coor,必須交易) 等三個COM+元件構成 2.1 訂單元件(Order,支援交易) 非常單純的訂單維護元件,只擺標準的Data Access Component(DataSetProvider-ADOQuery-ADOConnection)及作必要的設定 2.2 庫存元件(WareHouse,支援交易) 提供庫存資料維護及下述方法供控制產品庫存量 function ReduceCount(const product_id: WideString;product_count: Integer): Integer; //扣減庫存數量(產品代號,扣減數量):成功傳回0,失敗傳回不足數量 2.3 協調元件(Coor,必須交易) 協調元件件,負責異動定單並執行扣庫存動作,若扣庫存失敗會將不足數量與產品代號由NotEnoughCount,ProductID傳回 function MyApplyUpdates(Delta: OleVariant;out NotEnoughCount: Integer; out ProductID: WideString): OleVariant; 3.Client Tier設計 簡單的維護程式主要有兩個畫面分別為訂單維護畫面與庫存維護畫面,使用訂單維護畫面時,請預先設定產品的庫存數量 執行訂單項目更新時會呼叫 協調元件 MyApplyUpdates方法,若失敗會傳回庫存不足的數量 ps.Client 套透過SocketConnection連接Server /*資料庫安裝*/ 執行本程式之前請先在Database Create 兩個表格分別為 1.order 結構如下 order_no int //訂單編號 Prime Key product_id varchar(40) //產品代號 Prime Key order_number int //訂購數量 price money //單價 2.WareHouse 結構如下 product_id varchar(40) //產品代號 Prime Key product_count int //庫存數量 Server端元件與Database連結方式採外部檔案控制,因此請將所附檔案DBConn.udl copy 至C:\底下,並雙擊重新設定Database連結方式 /*關鍵程式碼*/ /~Server Tier~/ //扣減庫存數量(產品代號,扣減數量):成功傳回0,失敗傳回不足數量 function TWarehouse.ReduceCount(const product_id: WideString; product_count: Integer): Integer; var remainCount:integer; begin try adoquery1.SQL.Text := 'select * from WareHouse where product_id = '+QuotedStr(product_id); adoquery1.Open; adoquery1.First; if adoquery1.Eof then adoQuery1.AppendRecord([product_id,0]); remainCount := adoQuery1['product_count'] - product_count; if remainCount >=0 then begin//庫存量足夠應付訂單 adoQuery1.Edit; adoQuery1['product_count'] := remainCount; adoQuery1.post; SetComplete; result := 0; end else begin//庫存量不足,設定交易失敗 SetAbort; result :=abs( remainCount); end; except SetAbort; end; end; //協調元件件,負責異動定單並執行扣庫存動作,若扣庫存失敗會將不足數量與產品代號由NotEnoughCount,ProductID傳回 function TCoor.MyApplyUpdates(Delta: OleVariant; out NotEnoughCount: Integer; out ProductID: WideString): OleVariant; var order:IOrder; warehouse:IWarehouse; OwnerData:OleVariant; cds:TClientDataSet; product_id:string; product_count:integer; wc,ErrorCount:integer; begin order := CoOrder.Create; warehouse := CoWarehouse.Create; cds :=TClientDataSet.Create(self); try try //=====異動訂單資料===== result := order.AS_ApplyUpdates('DataSetProvider1',Delta,0,ErrorCount,OwnerData); //=====從Delta中解出訂單的異動數量來執行扣庫存動作===== cds.Data := Delta; cds.First;NotEnoughCount := 0;ProductID := ''; while not cds.Eof do begin wc := 0; if not cds.FieldByName('product_id').IsNull then product_id := cds.FieldByName('product_id').AsString; product_count := cds.FieldByName('order_number').AsInteger; case cds.UpdateStatus of //新增訂單項目故必須扣庫存 usInserted : wc := warehouse.ReduceCount(product_id,product_count); //刪除訂單項目故必須回補庫存 usDeleted : wc := warehouse.ReduceCount(product_id,-product_count); //異動庫存-先回補 usUnmodified : wc := warehouse.ReduceCount(product_id,-product_count); //異動庫存-後扣 usModified : wc := warehouse.ReduceCount(product_id,product_count); end; //若產品庫存量不足,終止異動動作 if wc > 0 then begin NotEnoughCount := wc; ProductID := product_id; SetAbort; exit; end; cds.Next; end; SetComplete; finally order := nil; warehouse := nil; cds.Free; end; except SetAbort; raise; end; end; /~Client Tier~/ procedure TForm1.Button1Click(Sender: TObject); var r:OleVariant; NotEnoughCount:integer; ProductID:WideString; begin cdsOrder.CheckBrowseMode; if cdsOrder.ChangeCount >0 then begin r:=scCoor.AppServer.MyApplyUpdates(cdsOrder.Delta,NotEnoughCount,ProductID); if NotEnoughCount = 0 then begin if cdsOrder.Reconcile(r) then begin cdsOrder.MergeChangeLog; Showmessage('訂單變更成功'); end; end else begin Showmessage(''''+ProductID+'''產品庫存量不足'+InttoStr(NotEnoughCount)+',請重新調整該項目數量。'); end; end end;撰寫分散式架構的系統遠比Cliet/Serve難上好幾倍,希望本程式對你有所幫助... 混心雜欲 棄修身~唉
------
唉~ |
||
weixubin
一般會員 發表:30 回覆:14 積分:8 註冊:2003-02-20 發送簡訊給我 |
|||
weixubin
一般會員 發表:30 回覆:14 積分:8 註冊:2003-02-20 發送簡訊給我 |
|||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: Speedup大哥 分原本想給你的,給錯了,怎麽辦? ========================= 同是炎黄子孙已請站長幫你改成未給分,請你重新指定得分者就可以了。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |