0

在我的 ASP.NET Web 应用程序中,我试图实现一个导入/导出过程以在应用程序数据库中保存或插入数据。我的程序会生成一些 CSV 文件:每个表一个。

显然,其中一些表之间存在关系,当我在数据库中导入 CSV 时,我想保持行之间的关联。

假设我有Table1,并且Table2Table2一个外键Table1。所以我可以有一行Table1ID = 100一行Table2Table1_ID = 100

当我导入带有Table1数据的 CSV 时,会为Table1行生成新的 ID,如何在Table2导入相应的 CSV 文件时保持外键的一致性?

我正在使用 Linq-to-SQL 从数据库中检索数据......使用DataSet并且DataTable可以帮助我吗?

注意我想允许累积导入,所以当我导入 CSV 文件时,数据库中可能已经有数据。所以我不能使用“设置身份关闭”。

4

1 回答 1

0

先添加Table1的项,这样添加Table2的项时,数据库中已经有Table1的对应记录了。对于更多表格,您将弄清楚顺序。如果您正在创建一个任意数据库模式的系统,您将需要在内存中创建一个表图(其中每个节点是一个表,每个弧是一个外键)[基础库中没有该类型的类型],然后将其转换为树,以便您通过遍历树(广度优先)获得正确的顺序。

您可以让数据库处理违反外键的情况,因为没有这样的字段。您必须决定是对整个导入操作还是按项目进行交易。

尽管可以事先分析 CSV。为此,您需要存储每个表的主键的值 [为此使用一个集合](同样,以正确的顺序遍历表),然后当您读取具有外部表的表时您已经阅读过的表的键,您可以检查键是否存在,它还可以帮助您检测任何可能的重复项。[如果您已经在数据库中考虑了一些事情,那么您也必须进行查询......但是,请注意数据库是否处于活动系统中,在您仍在决定是否可以添加记录时,记录可能会被删除CSV 没有问题]。


为了解决您在添加时生成新 ID...

我能想到的最简单的解决方案是:不要。特别是如果它是一个正在处理其他请求的活动系统,因为这样就无法事先预测新的 ID。最好的办法是一个一个地添加它们,在这种情况下,您将不得不相应地考虑您的交易策略......可能是您无法回滚的情况。

虽然,我认为您的问题更深一些:如果 Table1 的 ID 确实发生了变化,那么如何更新 Table2 中的相应记录,使其指向 Table1 中的正确记录?

为此,我想建议按照上面描述的方式进行分析,然后您将拥有一组可用作索引的集合。这将帮助您在 Table2 中为 Table1 中的每个 ID 找到需要更新的记录。[如果您已经更新了一条记录,跟踪也很重要,不要重复两次,因为生成的 ID 可能会与尚未发送到数据库的 ID 匹配]。

要回滚,您还可以使用这些集合,因为它们最终将具有新的 ID,用于标识如果您想中止操作必须从数据库中提取的记录。

编辑:那些集合(我推荐 hashset)只有故事,因为它们只有主键(例如:表 1 中的 ID)。您将需要袋子来保存外键(在本例中为 Table2 中的 Table1_ID)。

于 2012-06-01T08:03:29.793 回答