最近在弄三层结构的系统,首先用了com+组件,但这个东西用在局域网还行,用到广域网就有问题了.
然后尝试webservice(dll写好了)封装,.NET方面不太熟悉,力不从心.总之一个郁闷呐.
还想到用winsock之类,下载一个"网络数据集"控件看了下,未果.
故征求一下: 三层结构内中间层与应用层的交互方法.

解决方案 »

  1.   

    建议看看 OLE DB SDK ,做成个 OLEDB 驱动提供者,这样
    客户端只要安装这个程序,就可以用 ADO 实现远程数据访问了。
      

  2.   

    我尝试过用 VC 开发类似 ADO 的 COM 组件,其他部分都好解决,就是
    模拟 Fields 集合的时候被卡住了,发现在 VC 下弄 VB 的集合的概念
    的确不容易,要去弄 COM 模型(东西太多了,没吃透)。后来就在 VB 
    中模拟了一个库,仿 ADO 的类库,里面多了一个 NetworkClass 类,
    使用是这样的:Dim NetObj As New NetworkClass
    Dim Conn As New NetConnection
    Dim rs As New NetRecordset
    If NetObj.Connect("127.0.0.1",999,"PASSWORD")=True Then
       If Conn.Open_("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                     "D:\uu.mdb;Persist Security Info=False", NetObj)=True Then
          rs.Open_ "Select * From 表1",Conn,3,3
          rs.AddNew
          rs!字段1 = "测试"
          rs.UpdateBatch
          rs.Close_
          Conn.Close_
       End If
       NetObj.Close_
    End If
    Set rs = Nothing
    Set Conn = Nothing
    Set NetObj = Nothing看起来和用 ADO 差不多,但是看到 Open_ 和 Close_ 这些方法的名称,怎么感觉
    都不爽,所以一开始才想用 VC 弄,但是 VC 水平有限,就只有这么弄了。
    后来看了很多资料,发现类似于“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\uu.mdb;Persist Security Info=False”这种东西都是用 OLEDB 提供
    者的方式弄的。所以我现在也在看这方面的资料。直接用 ADO 效果要比模拟的好得多,
    ,呵呵.
      

  3.   

    数据安全部分你可以用我资源里的一个DLL呀,是我用VC写的,速度还不错,加密效果也还可以,主要就是加密字节流的,你可以去看看。
    http://download.csdn.net/source/1977527
      

  4.   

    这段时间我还在弄PPMD压缩,配合这个加密方法,网络传输效果会更加好
      

  5.   

    这是我用VB写的客户端 COM
      

  6.   

    你用winsock发送信息的  ,接收数据的时候是如何解析的啊
      

  7.   

    在握手中rs是这样的C -> S   发送 数据集Open 操作请求
    S -> C   询问 CONN 实例ID(由CONN创建时由服务器分配取得记录在CONN对象的属性中)
    C -> S   发送 CONN 实例 ID
    S -> C   询问发送长度
    C -> S   发送SQL语句字节长度以及打开方式的参数
    S -> C   告知准备好接收
    C -> S   发送SQL语句内容
    S -> C   告知 Fields 集合的数量
    请求接收具体数据部分
    C -> S   请求接受第一个 Field 内容
    S -> C   告知 Field 的类型及数据大小等相关参数
    C -> S   准备好接收数据
    S -> C   发送第一个Field内容(以数据流的方式发送)
    C 端收到数据将处理自己的Fields集合内容
    重复请求接收具体数据部分
    完成后C短告知服务器任务完成,组件方法返回,服务器继续等待命令
      

  8.   

    我上面忘记说了,rs 也有实例ID的
    ...
    S -> C 询问 CONN 实例ID(由CONN创建时由服务器分配取得记录在CONN对象的属性中)
    C -> S 发送 CONN 实例 ID
    S -> C 询问 RS 实例ID(由RS创建时由服务器分配取得记录在RS对象的属性中)
    C -> S 发送 RS 实例 ID
    ...
      

  9.   

    好像在哪儿看过用Winsock发送SQL Query.返回结果也是用Winsock送回。
      

  10.   

    在广域网 如果,程序所在的电脑能访问数据库所在的局域网中某主机的资源就好办了。直接把dll放在那台电脑上,然后在本机注册。连Winsock发送数据都不用了。
    方正的一个大型项目的架构就类似,中间层的dll都放在一台电脑上,然后其他的电脑都注册那台电脑的dll。
      

  11.   

    呵呵,要不你用BS做试试~~
    大不了现学现用呗~
    不怕麻烦就用楼上的那种方式,把底层代码再写一遍。我还是感觉你的这个项目换BS好处理一些。
      

  12.   

    VPN我没用过,不知道是不是稳定,Tiger_Zhao 说的估计有谱! 
      

  13.   

    登陆VPN后,在互连网上可以象访问内网一样访问你的数据库服务器,也就是说你的程序只要在局域网里能用,不用改程序,在互连网上只需要登陆VPN即可正常使用.
    既然是三层结构,就应当考虑用B/S结构,客户端基本不用安装程序,仅通过IE浏览器登陆系统,这样只需要配好中间件服务器,中间件服务器可以直接访问数据库服务器.这个好处不言而喻
      

  14.   

    哦,我明白了。
    如果是ORACLE数据库,可以直接使用tuxedo中间件。
    如果是SQL SERVER,且使用VB作为开发语言,则可以先实现SOCKET通讯,然后实现自定义协议的序列化和反序列化,最后实现数据库对象的序列化和反序列化。数据流载体可以使用XML,也可以自定义,不过感觉还是使用现有的技术如WEB SERVICE来得方便。
    作用技术尝试,ADO提供了OLE DB Provider编程技术,对于实现数据库访问提供了技术支持;此外,ADO的Recordset对象支持从XML中加载数据,支持断开连接的记录集,还支持事件,这都对客户端数据库对象的缓存提供了支持。