客户端有两个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后数据显示不正常,请问如何解决?
SocketConnection--cds1--ds1--DG1
SocketConnection--cds2--ds2--DG2
cds1和cds2都连接服务器的DataSetProvider
cds1的PacketRecords是2,cds1的PacketRecords是5,两个button分别控制DG1和DG2的GetNextPacket,但由于应用程序服务器只有一个DataSetProvider,因此在客户端按下button后数据显示不正常,请问如何解决?
只有一个DataSetProvider,问题是不是出在这里?关键是不能连接一个客户端就创建一个DataSetProvider,那样没有意义,不知道该如何解决?
至于为何服务端只弄一个DataSetProvider,我想原因很简单,也很容易理解,既然做的是三层,那不可能多一个客户端就多加一个DataSetProvider,那样就失去三层的意义了。
我就知道你对三层概念的理解,完全错了,所以才有此一问。不管采用哪种三层架构,基于COM的、DataSnap,还有现在的DataSnap 2009, 通常方式下,当每个客户端请求连接时,服务器都会单独创建一个DataSetProvider所在容器的实例,并专属为此客户端服务。所以,每个客户端连接,是与一个容器实例一一对应,而不是里边的哪个DataSetProvider控件对应,当有多个客户端连接时,就会有多个容器实例被创建。如果在一个客户端内部,有多个cds的时候,当然需要在服务器容器类中放多个dsp,分别服务于,来自一个客户端内部的多个cds数据请求。
这样就解决问题了。
一个客户端中分别打开多个Query,也可以共用TDataSetProvider;
但一个客户端中如果要同时打开几个Query并保持连接,那就要相应有几个TDataSetProvider。
这句说错了,其实不是共用,是服务端,为每个客户端新生成一个服务实例。
谢谢,不过还是没能太理解“当每个客户端请求连接时,服务器都会单独创建一个DataSetProvider所在容器的实例,并专属为此客户端服务”这句话,能在具体说明一下吗?