应用感知数据导入

时间:2010-03-04 18:00:30

标签: c# sql-server-express

我正在构建一个将数据导入sql server 2008 Express db的应用程序 该数据库正由当前正在生产的应用程序使用 需要导入的数据来自各种来源,主要是Excel工作表和xml文件。

数据库包含以下表格:

  • 工具
  • 电动工具
  • strikingtools
  • 所有者

源文件中的每一行或xml标记都包含有关1个工具的信息:
名称,工具类型,重量,瓦数,所有者,材料等......

这些行中的每一行都具有工具所有者的名称,该名称必须插入到所有者表中,但前提是该名称尚未包含在其中。 对于这些行中的每一行,需要在工具表中插入新行 tools表有一个字段owner_id,其中包含owner表的外键,其中需要设置所有者表中相应行的主键。 根据工具类型,必须在powertools表或strikingtools表中创建新行。这两个表还有一个tool_id字段,其中包含必须填写的工具表的外键 tools表有一个tool_owner_id字段,其中包含必须填写的所有者表的外键。

如果导入文件中的任何行由于某种原因导致无法导入,则需要回滚整个导入

目前我正在使用数据集来执行此操作,但对于某些大型文件(超过200,000个工具),这需要相当多的内存。有人能想到更好的方法吗?

3 个答案:

答案 0 :(得分:2)

有两个主要问题需要解决:

  • 有效地解析大型XML文档。
  • 将大量记录添加到数据库中。

XML解析
虽然DataSet方法有效,但整个XML文档都会加载到内存中。要提高使用大型XML文档的效率,您可能需要查看XmlReader类。 API比DataSet提供的API稍微难以使用。但是你将获得不立即将整个DOM加载到内存中的好处。

将记录插入数据库
为了满足您的Atomicity要求,您可以使用单个数据库事务,但是您为单个事务处理的大量记录并不理想。您很可能会遇到以下问题:

  • 数据库必须处理大量锁
  • 可能从行锁升级到页锁甚至表锁的数据库锁。
  • 在导入过程中,同时使用数据库会受到严重影响。

我建议使用以下内容而不是单个数据库事务:

  • 查看是否可以创建较小的事务批次。一次可能有100条记录。也许可以逻辑地将XML文件的各个部分加载到一起,从而可以接受将数据的子集作为一个单元加载到系统中。
  • 预先验证您的数据量。例如。检查是否填写了必填字段或FK是否正确。
  • 使上传可重复。跳过现有数据。
  • 提供手动撤消策略。我知道这说起来容易做起来难,但甚至可能需要作为额外的业务规则。例如,上传成功,但有人在几小时后意识到上传了错误的文件。

将数据上传到数据库中的初始暂存区域以执行验证并标记已处理的记录可能很有用。

答案 1 :(得分:0)

使用SSIS,创建和ETL包。

答案 2 :(得分:0)

使用Transactions进行回滚功能,以及处理创建/检查外键的存储过程。