【问题标题】:DataTable.GetChanges() keeps returning NULLDataTable.GetChanges() 不断返回 NULL
【发布时间】:2009-11-09 17:18:30
【问题描述】:

我正在尝试获取allData 中存在但removeData 中不存在的所有行

public static DataTable RemoveDuplicateRows(DataTable allData, 
    DataTable removeData) 
{
    removeData.Merge(allData);
    DataTable newData = removeData.GetChanges(); 
    removeData.RejectChanges();
    return newData;
}

removeData 在这种情况下调用之前为空(只是一个新的 DataTable();)

但是newDataDataTable newData = removeData.GetChanges(); 行之后总是有一个空值

最终解决方案:

    public static DataTable RemoveDuplicateRows(DataTable allData, DataTable removeData) 
    {
        DataTable duplicate = allData.Clone();
        foreach (DataRow row in allData.Rows)
        {
            duplicate.ImportRow(row);
        }
        foreach (DataRow row in duplicate.Rows)
        {
            row.SetAdded();
        } 

        removeData.Merge(duplicate);
        DataTable newData = removeData.GetChanges(DataRowState.Added);
        removeData.RejectChanges();
        allData.RejectChanges();
        return newData;
    }

【问题讨论】:

    标签: .net datatable


    【解决方案1】:

    DataTable.GetChanges() 方法依赖于DataRow.RowState 属性。对于一对 DataTables 中的每一行,DataTable.Merge() 将保留其“RowState”属性,或将其重置为“未更改”(取决于您选择使用的重载)。 这意味着,当您将两个 DataTables 与具有“未更改”行状态的行合并时,合并后的表还将包含“未更改”行,并且 DataTable.GetChanges 方法将返回 null 或 Nothing。

    【讨论】:

      【解决方案2】:

      您的removeData 数据表需要与allData 具有相同的列/字段。换句话说,它不能只是一个 new DataTable()。

      【讨论】:

      • 所以,现在我将旧数据和模式写入文件系统(WriteXml 和 WriteXmlSchema),然后将它们加载到 removeData(使用 ReadXmlSchema 和 ReadXml)。 allData 包含来自 db 的数据(比文件系统 xml 中的记录多 2 条)。所以当我看到这段代码时,我看到 allData 有 21 行,而 removeData 有 19 行。然后合并导致 removeData 有 40!然后 GetChanges 仍然返回 null
      • 修复了主键,这样当我合并时它们都有 21 行,但 GetChanges 仍然返回 NULL!
      • 必须努力使添加的行标记为已添加,我用最终解决方案更新了原始问题
      猜你喜欢
      • 1970-01-01
      • 2015-02-23
      • 2012-05-11
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      相关资源
      最近更新 更多