今天看了下三层,现在一头雾水。
其中最大的疑问在于:比如我的客户端有N多个界面,这N个界面中可能需要N多的数据查询,那么这些查询是不是都必须在中间应用服务层中预先做好呢???
能不能象我们平时做数据库那样,只要将查询连接到CONNECTION中,执行查询就行了。这个地方相当不明白,麻烦大家指点下。

解决方案 »

  1.   

    TClientDataSet不是有CommandText供你传递SQL吗?
      

  2.   

    我也这样做了,但出现一个错误提示:CommandText changes are not allowed.
      

  3.   

    SQL语句肯定是预先写好的,然后在UI层用中间层提供的定位器来执行
      

  4.   

    CommandText   changes   are   not   allowed.你没有把 中间层的 DataSetProvider 的属性options.poallowcommandtext = true;
      

  5.   

    DataSetProvider   的属性options.poallowcommandtext   =   true;
      

  6.   

    谢谢loveWife hsmserver 以及其它朋友:我还有两个问题看我理解正确与否:
    1.其实中间层要做到最简单的话,是不是就只放一个ADOCONNECTION\ADOQUERY\DataSetProvider就行了?2.我刚刚看了下,三层也存在安全问题,比如,如果我知道了SERVERNAME和COMPUTERNAME,我是不是可以立即编写一个程序连接上应用服务器,然后执行相关的SQL操作,甚至不用登录系统.(可能在这点上我大错特错了,但现在确实还不知道错在哪儿)以上两点还望多多指教.
      

  7.   

    1、中间层一般只需要一个ADOCONNECTION,除非你的中间层要用到多线程并发访问,动态创建ADOCONNECTION。但ADOQUERY/TADODataSet、DataSetProvider可以有多个,看起来结构会比较清晰,比如支持主细表查询。2、三层安全问题在于你怎么写接口,考虑到安全性,应该要把options.poallowcommandtext设置成false,这样客户端就无法知道ServerName以及Computer就可以获得数据。数据获取可以通过接口,接口调用需要用户帐号密码验证,这样可以提高中间层的数据安全性。举个简单例子,中间层提供一个执行客户端SQL函数:function runsql(const id: WideString; const ip: WideString; const userId: WideString; 
                    const userPwd: WideString; const strSql: WideString): Integer; safecall;
      

  8.   

    你可以把SQL做参数传到业务层 把数据集做为返回值回来吧 只是实现的技术如果有差别 支持的数据类型会不一样 
      

  9.   

    你在服务器建立了远程服务,会产生一个TLB文件,里面有  ['{851007A7-DFBB-4862-BED5-9709785ECDB2}'] 接口,你的客户端要挂接这个接口,才能用,所以,不要担心,非法登陆的问题