client端只需要midas.dll就夠了!
     Com+在使用時需要進行用戶的驗證,當你在局域網里的時候,由于的所有的
機子都是在一個域里,他默認的所有的域成員都有權利訪問,你如果要在廣域網
上使用,你必須在服務器上建立客戶端的用戶,然后,把該用戶添加到你的com+
的角色當中,就可以訪問了!
     
     如果你現在還是在使用DCOMCONNECTION空間進行連接的話,我建議你不要用
,因為直接在廣域網中訪問com+的話需要很多的端口,而這些端口可能會被占用
,而且防火墻會阻擋這些端口,導致你的Com+無法訪問;所以我建議你使用Socke
tConnection控件來連接,這樣的話就只需要一個你指定的端口了,這樣的話通過
防火墻就比較方便了
/*1. 是不是com+的client也必須是域中的一個用戶?*/
     com+的服務器與客戶端不必安裝在一個域中,如何配置取決于你使用的連接
方式。
     例如當你使用HTTP方式連接時,你的應用即可以部署到Internet環境中。
     /*2. client在分了的時候除了附加midas.dll,是不是還需要別的文件?*/
     midas.dll這個文件在Delphi6以后的版本中已不再需要了。你可以在工程文
件中導入MidasLib單元。
     如果你將應用設及到的單元連接到程序中,那么在部署時不用附加任何文件
。
首先,COM+有兩個MTS組件,一個是MTS Object, 另一個是MTS DATA MODULE;
MTS Object建立時同時用DcomConnection建立MTS DATA MODULE,MTS Object有1
個GetDatas取數據方法和UPDATAS存儲數據方法,當方法完成時就執行SetComplet
e或SetAbort。
     Updates的方法如下:
     PRocedure tmtsbook.updatas(vDatas : olevariant; iMaxError 
:Integer; Var iErrorCount : Integer);
     Var SerObj : IAppServer;
     OwnData : OleVariant
     begin
     try
     serobj := FMydm.dcombooks.GetServer;
     serobj.As_applyupdates(vDatas, iMaxError, iErrorCount, Owndata);
     setcomplete;
     except
     setabort;
     end;
     end;
     結果,調用這個updatas更新數據,總把修改的數據更新到最后一條記錄。
來賓發言:我經常通過在AppServer端定義事務處理的相關方法來解決(210字節) 
來賓姓名:henrycheng 
來賓發言:
    就是在Server端定義如下的可以遠程調用的方法,然后在客戶端根據需要直
接調用它們。
     procedure TRemoteServer.Start; safecall;
     procedure TRemoteServer.Commit; safecall;
     procedure TRemoteServer.RollBack; safecall;
 這種方法的確可以實現事務處理的要求,但有一個致命的問題是:一旦有客戶端
開始一個事物后與網絡失去聯系(如死機等)將導致其他客戶端陷入無限的等待
狀態,因為此時數據表被鎖定,只有提交或回滾這個事物后才會解鎖! 影響其它
用戶。
但前提是中間層必須能夠解析客戶端提交的數據的邏輯結構。這時,最好的方法
是建立相應的信息模型或數據模型,客戶端根據信息模型處理輸入、輸出,中間
層處理應用邏輯,包括存儲邏輯。我們現在就是這么做的。如果你希望進行進一
步的探討,可以跟我聯系。
clientdataset可將數據集,包括所有你輸入的臨時數據庫打包成xml傳給中間層,
     中間層實現在事務中進行MVC中的M層是否更新過的判斷
     具體實現大家自已琢磨吧!
來賓發言:我這樣做的……(46字節) 來賓姓名:duke 
來賓發言:
    中間層定義連接控件的事物處理。
     在客戶端調用。 
來賓發言:
    剛做三層結構,聽大家意見,把一個C/S結構改為三層,事物處理我這樣用不
知可行否?
     服務端定義接口:
     procedure TBarDCOMServer.isTrans(const iStates: WideString);
     begin
     if iStates='BeginTrans' then
     ServerMainF.ADOConnection1.BeginTrans
     else if iStates='CommitTrans' then
     ServerMainF.ADOConnection1.CommitTrans
     else if iStates='RollbackTrans' then
     ServerMainF.ADOConnection1.RollbackTrans;
     end;
     
     客戶端調用:
     dm1.DCOMConnection1.AppServer.isTrans('BeginTrans');
     try
     errorCounts:=0;
     errorCounts:=errorCounts+dm1.kcspIndexCD.ApplyUpdates(0);
     errorCounts:=errorCounts+dm1.yyCD.ApplyUpdates(0);
     if errorCounts=0 then //提交是否有錯誤
     dm1.DCOMConnection1.AppServer.isTrans('CommitTrans')
     else
     begin
     dm1.DCOMConnection1.AppServer.isTrans('RollbackTrans');
     ShowMessage('Error');
     exit;
     end;
     except
     dm1.DCOMConnection1.AppServer.isTrans('RollbackTrans');
     ShowMessage('網絡忙,請重試。');
     end;
     
     由于提交時,如果有錯誤并不觸發異常,因此try……except……end似乎不
起作用,所以定義一個變量errorCounts來記錄提交返回的錯誤數,由此決定是否
提交事物。
     
     此方法沒有經過實踐,明天把程序發給客戶使用后,再做判斷是否可行。
     不過,我想應該有更好的方法,請有多層經驗的朋友指教一下。 
***可以,不過在COM接口中應該用olevariant
三層結構,在別的機器上運行客戶端,提示“拒絕聯接”如何注冊.TLB文件?(68
字節) 
此錯誤不是客戶端的問題,而是服務端的COM的權限不正確
     2。將服務端的*.tlb文件加入到客戶端的項目中即可
webconnection
多出來的一步是吧httpsrvr.dll發布到IIS具有執行權限的virtual dir中
設置好httpsrvr.dll在服務器的http URL以及Server的GUID就行了 
其他大同小異。具體看Delphi的Help,什么都有
新聞熱點
疑難解答