客户端有两个ClientDataSet:cds1和cds2,两个DataSource,ds1和ds2,两个DBGridEh,DG1和DG2,一个SocketConnection,f应用程序服务器有一个ADOQuery,一个DataSetProvider,连接情况如下:
SocketConnection--cds1--ds1--DG1
SocketConnection--cds2--ds2--DG2
cds1和cds2都连接服务器的DataSetProvider
cds1的PacketRecords是2,cds1的PacketRecords是5,两个button分别控制DG1和DG2的GetNextPacket,但由于应用程序服务器只有一个DataSetProvider,因此在客户端按下button后数据显示不正常,请问如何解决?

解决方案 »

  1.   

    在服务器端有没有创建TRemoteDataModule,创建了这个就不会有问题,他是一个连接一个对象。
      

  2.   

    已经创建远程数据模块了,DataSetProvider就是在远程数据模块上的,但就是有这样的问题。
    只有一个DataSetProvider,问题是不是出在这里?关键是不能连接一个客户端就创建一个DataSetProvider,那样没有意义,不知道该如何解决?
      

  3.   

    服务器端还是分别扔两个DataSetProvider,分别响应cds1和cds2的请求,这样传统、简单。没必要为了节约一个DataSetProvider控件实例那一点点的内存,把事情弄复杂了。方法是有,但你要先回答,服务器端只弄一个DataSetProvider,有什么现实必要性?
      

  4.   

    首先谢谢指导。
    至于为何服务端只弄一个DataSetProvider,我想原因很简单,也很容易理解,既然做的是三层,那不可能多一个客户端就多加一个DataSetProvider,那样就失去三层的意义了。
      

  5.   


    我就知道你对三层概念的理解,完全错了,所以才有此一问。不管采用哪种三层架构,基于COM的、DataSnap,还有现在的DataSnap 2009, 通常方式下,当每个客户端请求连接时,服务器都会单独创建一个DataSetProvider所在容器的实例,并专属为此客户端服务。所以,每个客户端连接,是与一个容器实例一一对应,而不是里边的哪个DataSetProvider控件对应,当有多个客户端连接时,就会有多个容器实例被创建。如果在一个客户端内部,有多个cds的时候,当然需要在服务器容器类中放多个dsp,分别服务于,来自一个客户端内部的多个cds数据请求。
      

  6.   

    你在建立unit uRemoteData时,就要为每一个TADOQuery,分另对应一个TDataSetProvider;
    这样就解决问题了。
         
      

  7.   

    多个客户端会共用TDataSetProvider;
    一个客户端中分别打开多个Query,也可以共用TDataSetProvider;
    但一个客户端中如果要同时打开几个Query并保持连接,那就要相应有几个TDataSetProvider。
      

  8.   

    多个客户端会共用TDataSetProvider;
    这句说错了,其实不是共用,是服务端,为每个客户端新生成一个服务实例。
      

  9.   


    谢谢,不过还是没能太理解“当每个客户端请求连接时,服务器都会单独创建一个DataSetProvider所在容器的实例,并专属为此客户端服务”这句话,能在具体说明一下吗?