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,什么都有
没有相关教程
|