我确信这是一个典型的情况。
我有一个数据库,我有一个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();它返回了整个地段。如果我接受更改并更新它仍然无效。
答案 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>