【问题标题】:How to consolidate data into tables c# SQL如何将数据合并到表中 c# SQL
【发布时间】:2018-09-19 02:19:25
【问题描述】:

我有通过 xml 阅读器读入数据集的 XML 数据。

生成的表有几种关系,但主要是父节点到子节点。

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

考虑到 XML 文件,例如节点子节点对每个节点都有顺序 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 server最后插入的id值,然后修改内存中c#datatable中存在的数据表再插入sql?

或者有没有更好的方法,比如使用根节点的 GUID 的版本控制方法?

编辑: 我从外部来源接收 xml 文件,它们与数据一起提供。 我将这些 XML 文件读入一个数据集,该数据集基本上给了我 8 个表格,表格中的行是连续的,并且这些表格根据这个序号相互关联。

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

【问题讨论】:

  • 您考虑过使用数据库标准化吗?这将解决您的问题。
  • @dj79 我从外部源接收 xml 文件,它们与数据一起提供。我将这些 XML 文件读入一个数据集,该数据集基本上给了我 8 个表 - 除了一个表(我在 xml 导入中处理)之外,这些表似乎已正确规范化。您能否向我解释一下数据库的规范化如何允许我将收到的记录插入到数据库中,这些记录已经分配了顺序 ID,而不复制先前导入的 xml 文件?

标签: c# sql-server import consolidation


【解决方案1】:

您应该在每个 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();
}

【讨论】:

  • 是的 Insert Parent - 获取 ID ,然后使用该 ID 更新孩子,这就是我想我需要做的,但它似乎很“拖沓” - 就像当你有一个全新保时捷。数据集上的 xmlreader 使 xml 可用于处理和插入 - 这就是我使用数据集的原因 - 我不知道 datacontext 是否具有如此快速的酷功能(但现在你让我躲避它(DuckDuckGo)。)
猜你喜欢
  • 2013-12-13
  • 2020-02-03
  • 2013-03-21
  • 2016-04-07
  • 2011-06-17
  • 2015-08-05
  • 2020-12-13
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多