我有XML数据,我通过xml阅读器将其读入数据集。
生成的表具有多个关系,但主要是父节点到子节点。
我计划每天读取多个文件,并将这些文件合并到SQL服务器中。它们可以很容易地被其他系统使用的地方。
例如,考虑到XML文件,节点子节点的每个节点都有顺序的ID
。<main mainGUID='BlahWeSayItIsUnique' stuff type=1>
<children thingy Number>
<child other things>
<child other things>
子项将获得children_Id作为主键,子项将获得children_id作为关系,其自己的child_Id作为主键。这些数字将在 1...n 中连续排列,因此每个 xml 文件肯定会重复这些 id 值。
那么什么是正确的方法或一个好的方法插入数据而不重复id? 我是否获取 sql 服务器上次插入的 id 值,然后修改内存中 c# 数据表中存在的数据表,然后插入到 sql 中?
或者是否有更好的方法,例如使用根节点中的 GUID 的版本控制方法?
编辑:我正在从外部来源接收xml文件,它们随数据一起提供。 我将这些XML文件读入一个数据集,该数据集基本上给了我8个表,表中的行是连续的,并且基于这个顺序数字,这些表彼此相关。
数据已经分配了顺序 id,那么如何在不复制以前导入的 xml 文件的情况下将这些记录插入 SQL 数据库?
您应该在每个 id 列上都有标识。插入记录时,数据库将为您生成新的唯一 ID。您可以读取 id 的值并使用此新值更新所有引用。它可以看起来像这样
DataSet dataSet = new DataSet();
ParentDataTable parentTable = dataSet.Parent;
ParentTableAdapter parentAdapter = new ParentTableAdapter();
ParentRow parentRow = parentTable.NewParentRow();
parentRow.p_id = -1;
parentRow.p_name = "Best parent";
parentTable.AddParentRow(parentRow);
parentAdapter.Update(parentTable);
ChildDataTable childTable = dataSet.Child;
ChildTableAdapter childAdapter = new ChildTableAdapter();
ChildRow childRow = childTable.NewChildRow();
childRow.ch_id = -1;
childRow.ch_name = "Best child";
childRow.ch_parent = parentRow.p_id;
or
childRow.ParentRow = parentRow;
childTable.AddChildRow(childRow);
childAdapter.Update(childRow);
将 id 辅助为负值是处理冲突的一种方法。您必须以正确的顺序一次更新一个表。我个人会离开数据集并使用数据上下文。它看起来像
var parent = new Parent()
{
p_name = "Best parent"
};
var child = new Child()
{
ch_name = "Best child",
Parent = parent
};
using (var dc = new DataContext())
{
dc.Parents.InsertOnSubmit(parent);
dc.Childs.InsertOnSubmit(child);
dc.SubmitChanges();
}