機子都是在一個域裡,他默認的所有的域成員都有權利訪問,你如果要在廣域網
上使用,你必須在服務器上建立客戶端的用戶,然後,把該用戶添加到你的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,什麼都有