比如说我有两个数据集:clientDataset1,clientDataSet2;
这两个数据集的字段是完全相同,当执行到下面的代码时就出错了:
   if clientDataSet2.Data <> clientDataSet1.Data then //出错当然通过FOR循环判断每一个字段的值是否相等是可以判断的,
请问有更好的方法吗?

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Stream1,Stream2: TMemoryStream;
    begin    Stream1:= TMemoryStream.Create;
        Stream2:=TMemoryStream.Create;
        try
          ClientDataSet1.SaveToStream(Stream1);
          ClientDataSet2.SaveToStream(Stream1);
          if  Stream1.Size<>Stream2.Size then
            ShowMessage('不相同')
          else if not CompareMem( Stream1.Memory,Stream2.Memory,Stream1.Size) then
              ShowMessage('不相同')
          else
              ShowMessage('相同');
        finally
          Stream2.Free ;
          Stream1.Free;
        end;
    end;
      

  2.   

    2楼的
     if  Stream1.Size <>Stream2.Size then 
    只是比较流的大小,并不能说明两个记录就是相同的
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Stream1,Stream2: TMemoryStream;
    begin    Stream1:= TMemoryStream.Create;
        Stream2:=TMemoryStream.Create;
        try
          ClientDataSet1.SaveToStream(Stream1);
          ClientDataSet2.SaveToStream(Stream1);
          if  Stream1.Size <>Stream2.Size then
            ShowMessage('不相同')
          else if not CompareMem( Stream1.Memory,Stream2.Memory,Stream1.Size) then
              ShowMessage('不相同')
          else
              ShowMessage('相同');

        finally
          Stream2.Free ;
          Stream1.Free;
        end;
    end;
    这个是对的,它是先比较大小,如果大小都不一样就表示不同,否则比较内存
      

  4.   

    刚开始读取数据的时候我执行了以下动作
      ClientDataSet2.Data := ClientDataSet1.Data;之后我对ClientDataSet1进行了一些操作,但还是恢复到原来的样子。
    比如有一个字段"AA"的内容为"123456",我对这个字段进行修改成"123",再修改
    成"123456"后执行madyak的方法时提示不相同。
    执行到
    if  Stream1.Size <>Stream2.Size then 这句时提示“不相同”.这又不是我想要的结果,似乎Stream1.Size 应该还是等于 Stream2.Size 才对呀。
     
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      Stream1,Stream2: TMemoryStream; 
    begin     Stream1:= TMemoryStream.Create; 
        Stream2:=TMemoryStream.Create; 
        try 
          ClientDataSet1.SaveToStream(Stream1); 
          ClientDataSet2.SaveToStream(Stream1); 
          if  Stream1.Size <>Stream2.Size then 
            ShowMessage('不相同') 
          else if not CompareMem( Stream1.Memory,Stream2.Memory,Stream1.Size) then 
              ShowMessage('不相同') 
          else 
              ShowMessage('相同'); 
        finally 
          Stream2.Free ; 
          Stream1.Free; 
        end; 
    end; 
      

  6.   

    刚开始读取数据的时候我执行了以下动作 
      ClientDataSet2.Data := ClientDataSet1.Data; 之后我对ClientDataSet1进行了一些操作,但还是恢复到原来的样子。 
    比如有一个字段"AA"的内容为"123456",我对这个字段进行修改成"123",再修改 
    成"123456"后执行madyak的方法时提示不相同。 
    执行到 
    if  Stream1.Size <>Stream2.Size then 这句时提示“不相同”. 这又不是我想要的结果,似乎Stream1.Size 应该还是等于 Stream2.Size 才对呀。 
      

  7.   

    我上面只是一个简单的例子,因我对ClientDataSet1进行一些操作后
    如果跟最初的没有什么变化就不需要保存(因保存要花的时间比较长),
    我本来想用clientDataSet1.changeCount来判断是否有变化,
    但是这个属性有时也判断不出来。
      

  8.   

    如果按照你这么说,即使记录值都一样,但这两个Data肯定是不一样,因为它记录了你一系列的操作和Delta,这些没有提交之前是存在着的。
    建议还是逐条检验记录。
      

  9.   

    呵呵,我也不清楚修改后再恢复为原来的它怎么就不相等了呢?
    也许正如你所说的
    "它记录了你一系列的操作和Delta"。