如何将数据合并到表中 c# SQL

How to consolidate data into tables c# SQL

我有 XML 数据,我通过 xml reader 读入数据集。

生成的表有几个关系,但主要是 parent 节点到 child 节点。

我计划每天读取多个文件并将这些文件合并到一个 sql 服务器中。它们可以很容易地被其他系统使用的地方。

考虑到 XML 文件,节点 children 具有每个节点的顺序 ID,例如

<main mainGUID='BlahWeSayItIsUnique' stuff type=1>
   <children thingy Number> 
      <child other things>
      <child other things>

Children 将获得 children_Id 作为主键,而 child 将获得 children_id 作为关系和它自己的 child_Id 作为主键。这些数字将按 1...n 顺序排列,因此每个 xml 文件肯定会重复这些 id 值。

那么在不复制 id 的情况下插入数据的正确方法或好方法是什么? 我是否获取 sql 服务器最后插入的 id 值,然后修改内存中 c# datatable 中存在的数据表,然后插入到 sql 中?

或者是否有更好的方法,例如使用来自根节点的 GUID 的版本控制方法?

编辑: 我从外部来源接收 xml 文件,它们与数据保持原样。 我将那些 XML 文件读入一个数据集,它基本上给了我 8 个表,表中的行是顺序的,并且表根据这个序号相互关联。

数据已经分配了顺序 ID,那么如何将这些记录插入 SQL 数据库而不复制之前导入的 xml 文件?

您应该在每个 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 赋负值是一种处理冲突的方法。您必须按正确的顺序一次更新一个 table。我个人会留下数据集并使用数据上下文。看起来像

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();
}