gpt4 book ai didi

c# - DataSet Merge 和 AcceptChanges 得到 DiffGram

转载 作者:行者123 更新时间:2023-11-30 22:37:29 25 4
gpt4 key购买 nike

我有两个 XML 数据集,ds1 和 ds2。我使用 .ReadXML(name, XmlReadMode.ReadSchema) 读取这些数据集。我正在尝试通过使用如下所示的合并数据集来获得具有两者之间差异的 DiffGram。

DataSet ds3 = new DataSet();
ds3.Merge(ds1);
ds3.AcceptChanges();
ds3.Merge(ds2);

DataSet ds4 = ds3.GetChanges();

ds4.WriteXml("ds4.xml", XmlWriteMode.DiffGram);

ds1 和 ds2 各包含多个元素。我通过复制 ds1 文件并修改其中一条记录创建了 ds2。

但是,当我在执行后查看 ds4.xml 时,它显示了 ds1 中的所有记录集和 ds2 中的所有记录(因此它显示了重复的条目),并且 ds2 更新列为 ...diffgr :hasChanges="插入">。看起来这只是插入,而不是更新现有记录。

如何让 ds4 只显示在 ds2 中所做的更改?

最佳答案

这种插​​入与更新的行为通常是由于缺少定义的主键而发生的。您是否在表上设置了主键?这就是合并过程中列的匹配方式。 Per MSDN (强调我的):

When merging a new source DataSet into the target, any source rows with a DataRowState value of Unchanged, Modified, or Deleted are matched to target rows with the same primary key values. Source rows with a DataRowState value of Added are matched to new target rows with the same primary key values as the new source rows.

因此,对于每个 DataTable,您应该设置 PrimaryKey property .几年前,我在 MSDN DataTable.Merge 页面上写了一个详细的示例。你可以看看这里写的:Merge using Primary Keys for Expected Results .

这种方法的一个简单例子:

DataTable dt1 = new DataTable();
dt1.Columns.Add("ID", typeof(int));
dt1.Columns.Add("Customer", typeof(string));
dt1.PrimaryKey = new[] { dt1.Columns["ID"] };
dt1.Rows.Add(new object[] { 1, "Ahmad" });

DataTable dt2 = new DataTable();
dt2.Columns.Add("ID", typeof(int));
dt2.Columns.Add("Customer", typeof(string));
dt2.PrimaryKey = new[] { dt2.Columns["ID"] };
dt2.Rows.Add(new object[] { 1, "Mageed" });

// try without primary keys and it'll add a new record
dt1.Merge(dt2);

编辑:关于您的评论,您可以拒绝合并行上的更改,这些更改并没有真正更改,方法是通过下面的代码传递表格。接受 DataTable 的方法会更整洁。在调用 DataTable.AcceptChanges() method 之前使用此代码很重要, 否则行状态将被丢弃。

使用 LINQ:

foreach (DataRow row in dt1.Rows)
{
if (row.RowState == DataRowState.Modified)
{
var original = dt1.Columns.Cast<DataColumn>()
.Select(c => row[c, DataRowVersion.Original]);

bool isUnchanged = row.ItemArray.SequenceEqual(original);
if (isUnchanged)
{
row.RejectChanges();
}
}
}

如果 LINQ 不是一个选项:

foreach (DataRow row in dt1.Rows)
{
if (row.RowState == DataRowState.Modified)
{
bool isUnchanged = true;
foreach (DataColumn col in dt1.Columns)
{
if (!row[col.ColumnName].Equals(row[col.ColumnName, DataRowVersion.Original]))
{
isUnchanged = false;
break;
}
}

if (isUnchanged)
{
row.RejectChanges();
}
}
}

完成后可以调用dt1.AcceptChanges()

关于c# - DataSet Merge 和 AcceptChanges 得到 DiffGram,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com