程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 關於COM+的一些細節問題

關於COM+的一些細節問題

編輯:Delphi
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,什麼都有
  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved