none
Schema相同的两个DataSet,比较它们中的数据是否一致,并给出详细比较结果? RRS feed

  • 问题

  • Schema相同的两个DataSet,比较它们中的数据是否一致,并给出一个详细的比较结果(哪些表的那些行不一致)?
    .net中有没有现成的方法?大家有没有这样的算法?

    具体一点说:有一个DataSet,里面有数据,将其Copy一份,再对其里面的数据进行修改(增删修里面的行),
    现在比较两者的变化,哪些行变化了,哪些值变化了?
    2009年7月31日 6:15

答案

  • 你好。

    1. 可能是我没描述清楚,我实现的目的就是哪一列的值更新了,才修改哪一列(因为我们的列可能会非常的多,但修改的值又非常少,若是全部更新,太浪费了,呵呵)

    2. 我们使用的是Web Service。对于DataSet,以前我们仅传输DataSet中的数据XML,没想起来直接对其进行序列化。刚才“韦恩卑鄙”提到序列化,才想起来,我试了二进制序列化,没问题,其他的序列化应该也可以。 但是,有个问题:若将DataSet直接序列化进行传输,其数据量是不是比仅传输数据的数据量大很多??



    标准例程上  用getchanges以后 这个changes 结果序列化就可以了


    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    • 已标记为答案 CountaMa 2009年7月31日 9:48
    2009年7月31日 9:32
    版主

全部回复

  • 在你后面说的这个情况中 仅仅需要在修改过的  dataset  上 使用

    public System.Data.DataSet GetChanges()
        Member of System.Data.DataSet


    就可以取得一个  仅仅包含修改内容的数据集合


    里面的table 都是有修改的行



    System.Data.DataRow.this[int, System.Data.DataRowVersion]  可以访问 修改前和修改后的值   要比较才能确定哪一列被修改了


    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    2009年7月31日 6:32
    版主
  • 您好,如果只是想知道哪些行发生变化,可以使用DataRow的RowState来判断。
    请参考:http://msdn.microsoft.com/zh-cn/library/system.data.datarow.rowstate.aspx
    2009年7月31日 6:35
  • DataSet fSourceDS = new DataSet();
    // fSource 结构省略
    // fSource 填充数据省略
    DataSet fCopyDS = fSourceDS.Copy();
    // 对 fCopyDS 进行修改
    // 通过 GetChanges() 获取 fCopyDS 更改过的行,包括新增及删除的
    DataSet fChagedDs = fCopyDS.GetChanges();
    // 将更新的数据合并到最初那个 DataSet 中
    fSourceDS.Merge(fChagedDs);
                
    // 如果这个过程在提交数据到数据库之前需要反复执行那么你需要记录新增的行的主键,用于在 Merge 后手动删除这些新增了然后又删除的行
    // 原因是新增的行执行 Delete() 后是彻底删除并非将 RowState 置为 Deleted,调用 Merge 无法将这些记录反映到 fSourceDS

    知识改变命运,奋斗成就人生!
    2009年7月31日 8:11
    版主
  • 对于后一种情况可以这么处理,但是,对于某一行的哪一列作了修改只能遍历比较吗?有没有更好的方法?

    另外,这个DataSet的修改是在客户端进行的,我想将这个带有历史数据记录的DataSet传输到服务器端,在服务器端处理这些变更行,我使用的方法是这样的:
     ds.WriteXmlSchema(XX) 和 ds.WriteXml(XX, XmlWriteMode.DiffGram)将DataSet转化为Xml传输到服务器端;再使用dsDiffGram.ReadXml(srXml, XmlReadMode.DiffGram)将Xml转化为DataSet,新的DataSet中没有那些历史数据记录了。

    这样处理有问题吗?有没有其他的方法?
    2009年7月31日 8:20
  • 直接序列化就可以了  你用的是webservice么?


    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    2009年7月31日 8:31
    版主
  • 您好,个人意见请参考:
    1、“对于后一种情况可以这么处理,但是,对于某一行的哪一列作了修改只能遍历比较吗?有没有更好的方法?”
           个人意见:如果是用来更新数据库,不需要控制到列这么细,更新数据库时整行更新即可。

    2、不知道服务器端是采用什么技术?自己写的服务?Web Service?Remoting?WCF?
         如果是后三者实现应该是简单的,如果是自己写接收服务,建议将DataSet用序列化,可以格式成二进制、SOAP、XML然后再传送。到服务器端后反序列化即可。
    2009年7月31日 8:36
  • 你好。

    1. 可能是我没描述清楚,我实现的目的就是哪一列的值更新了,才修改哪一列(因为我们的列可能会非常的多,但修改的值又非常少,若是全部更新,太浪费了,呵呵)

    2. 我们使用的是Web Service。对于DataSet,以前我们仅传输DataSet中的数据XML,没想起来直接对其进行序列化。刚才“韦恩卑鄙”提到序列化,才想起来,我试了二进制序列化,没问题,其他的序列化应该也可以。 但是,有个问题:若将DataSet直接序列化进行传输,其数据量是不是比仅传输数据的数据量大很多??


    2009年7月31日 9:13
  • 哈,您好:
    我之前也遇到您的第一种情况,用DataTable来实现不适合控制到列。您可以测试一下,如果通过性能测试就可以整行更新。
    参照微软自动生成的update的sql也可以看出是整行来update。如果一定要控制到列,就得自己来写一个对象记录更新了哪些列,然后传送这个对象到服务器端。
    他们之间是性能和开发效率的博弈,可以根据模拟的性能测试场景来决定用哪个方案。

    第二个情况,您可以把DataSet或DataTable序列化到一个文件上,看看文件有多大,然后跟您实际的数据来比。
    2009年7月31日 9:21
  • 你好。

    1. 可能是我没描述清楚,我实现的目的就是哪一列的值更新了,才修改哪一列(因为我们的列可能会非常的多,但修改的值又非常少,若是全部更新,太浪费了,呵呵)

    2. 我们使用的是Web Service。对于DataSet,以前我们仅传输DataSet中的数据XML,没想起来直接对其进行序列化。刚才“韦恩卑鄙”提到序列化,才想起来,我试了二进制序列化,没问题,其他的序列化应该也可以。 但是,有个问题:若将DataSet直接序列化进行传输,其数据量是不是比仅传输数据的数据量大很多??



    标准例程上  用getchanges以后 这个changes 结果序列化就可以了


    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    • 已标记为答案 CountaMa 2009年7月31日 9:48
    2009年7月31日 9:32
    版主
  • 哈哈

    这就是我所需要的。 getchanges这方法经常见,这么面熟,怎么就想不起用呢, 

    多谢几位的帮助。
    2009年7月31日 9:47
  • 如果可以,直接在数据库端比较,一条语句就搞定了。
    http://hi.baidu.com/2009ajun
    • 已标记为答案 CountaMa 2009年8月3日 2:31
    • 取消答案标记 CountaMa 2009年8月3日 2:31
    2009年7月31日 11:49
  • 具体怎么个比较法? 请明示。有没有个小例子
    2009年8月3日 2:33