如何将数据合并到表中 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();
}
我有 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();
}