为什么我的Merge不工作?

时间:2011-10-31 21:39:57

标签: c# .net ado.net datatable dataset

我确信这是一个典型的情况。

我有一个数据库,我有一个XML数据文档。我想结合2并更新数据库。

我已经用数据库填充了DataSet和/或DataTable,如果我修改了该结构中的数据,我可以调用Update,一切都很好。

这就是我所拥有的。

con.Open();
adapter.Fill(ds2, "BASIC");
ds.ReadXmlSchema(@"C:\asis.xsd");
ds.ReadXml("c:\\asis.xml");

// This is the XML data
DataTable loadeddt = ds.Tables["BASIC"];

// This is from the DB
DataTable dbdt = ds2.Tables["BASIC"];

// I want to put the data from xml into the dataset from the DB
dbdt.Merge(loadeddt);


// I want to them put those changes in the db
adapter.Fill(dbdt);

发生了什么,在我加载XSD之前,我得到了一个异常,说类型不匹配。

现在我什么也没得到,没有例外没有变化。 DataTable都没有显示更改,DB也没有。

有人可以提出任何建议吗?

如果我将最后一行更改为Update,请获取以下内容:

违反PRIMARY KEY约束'PK_BASIC'。无法在对象'dbo.BASIC'中插入重复键。

我注意到如果你在合并之前/之后执行.Rows.Count,记录计数从10到20,所以它将它们合并......不合并它们。哎呀!

如果我调用dbdt.GetChanges();它返回了整个地段。如果我接受更改并更新它仍然无效。

2 个答案:

答案 0 :(得分:1)

对于此行,您应该致电Update而不是Fill

// I want to them put those changes in the db 
adapter.Fill(dbdt);

问题更新后:
您正在插入已存在的密钥。合并是告诉适配器应该在应该更新时插入,或者DB填充没有返回所有行。很难说出给出了什么。

这看起来有点像黑客,但如果您知道哪些行应该被视为更新,您可以在这些行上调用SetModified

答案 1 :(得分:0)

合适的人,

我找到了这篇文章:

http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-ado-net/14201/Merge-function-in-DataSet

基本上,XSD需要完全描述合并工作的主键。

基本上我需要添加:

<xs:key name="ROOTKey1"  msdata:PrimaryKey="true">
    <xs:selector xpath=".//BASIC" />
    <xs:field xpath="MEMBNO" />
</xs:key>