ClientDataSet的数据集合并问题?(100分)

  • 主题发起人 主题发起人 真.浪人西林
  • 开始时间 开始时间

真.浪人西林

Unregistered / Unconfirmed
GUEST, unregistred user!
在三层结构的系统中,为了减轻网络负载,ClientDataSet需要从同一张表中多次取得数据
集,而且每次使用的查询条件不相同,现在的问题是,如何将后来取得的数据合并到同一个
ClientDataSet中并且可对数据进行更新?
 
3层结构,一般要求中间层是无状态的。既然你要多次查询取数据,可以把条件都
传入中间层,由中间层一起查询后,把结果合并后再传过来。
也可以分开把查询,把每次查询的结果暂时保存再客户端,再再客户端合并。(不推荐这样做
,不符合多层结构把业务放在中间层的思想)
 
谢谢。
我的想法是根据客户对数据端的多次不同类型的操作返回不同的结果,但因为数据量很大,
而且只是对一张表,所以每次只需要返回他需要的那些数据即可,然后在客户端合并。
如果只传一次数据,那完全可以通过一次性的查询来解决,可是这样的话有一个实际的问题
就是给客户的响应时间太长。有没有更好的解决方案呢?
 
上一次查询的数据和下一次查询的数据有什么关系?
 
可能部分记录重复,可能没有关系,但肯定是同一张表
 
那不如在中间层写一个方法,客户端把SQL语句传过去,就可以返回数据了。
在客户端过滤相同的数据集
说明:
传入参数 1:SourceDataSet,要过滤的数据集;
2: FilterString,条件-同Filter属性
传出参数 过滤后的数据集
Function FilterDataSet(SourceDataSet: TClientDataSet;
FilterString: String): TClientDataSet;
Var
i, j: integer;
CDS1, CDS2: TClientDataSet;
s: String;
begin
s := FilterString;
CDS1 := TClientDataSet.Create(Nil);
CDS2 := TClientDataSet.Create(Nil);
CDS1.Data := SourceDataSet.Data;
CDS2.Data := SourceDataSet.Data;
CDS1.First;
CDS2.First;
For j := 0 To CDS2.RecordCount - 1do
CDS2.Delete;
CDS1.Filtered := false;
CDS1.Filter := s;
CDS1.Filtered := true;
Try
For j := 0 To CDS1.RecordCount - 1do
begin
CDS2.Insert;
For i := 0 To CDS1.Fields.Count - 1do
begin
CDS2.Fields.Value := CDS1.Fields.Value;
end;
CDS2.Post;
CDS1.Next;
end;
Result := CDS2;
Finally
FreeAndNil(CDS1);
FreeAndNil(CDS2);
end;
end;
 
kgafly兄,多谢了
我现在担心的就是数据量的问题,我试了一下,在客户端合并数据在数据量比较少的情况下
是可行的,但我不知道一旦出现几万条或几十万条记录会不会有影响,因为这样做等于多了
一次插入的过程,而且需要过滤数据。另外在更新时如何处理从CDS1到CDS2的数据?
 
我没搞懂为什么同一张表要查询那么多次。其实效率最高的还是
用SQL,把条件一次传过去不就可以查询出来了吗?
 
接受答案了.
 
后退
顶部