我正在构建一个将数据导入sql server 2008 Express db的应用程序 该数据库正由当前正在生产的应用程序使用 需要导入的数据来自各种来源,主要是Excel工作表和xml文件。
数据库包含以下表格:
源文件中的每一行或xml标记都包含有关1个工具的信息:
名称,工具类型,重量,瓦数,所有者,材料等......
这些行中的每一行都具有工具所有者的名称,该名称必须插入到所有者表中,但前提是该名称尚未包含在其中。 对于这些行中的每一行,需要在工具表中插入新行 tools表有一个字段owner_id,其中包含owner表的外键,其中需要设置所有者表中相应行的主键。 根据工具类型,必须在powertools表或strikingtools表中创建新行。这两个表还有一个tool_id字段,其中包含必须填写的工具表的外键 tools表有一个tool_owner_id字段,其中包含必须填写的所有者表的外键。
如果导入文件中的任何行由于某种原因导致无法导入,则需要回滚整个导入
目前我正在使用数据集来执行此操作,但对于某些大型文件(超过200,000个工具),这需要相当多的内存。有人能想到更好的方法吗?
答案 0 :(得分:2)
XML解析
虽然DataSet方法有效,但整个XML文档都会加载到内存中。要提高使用大型XML文档的效率,您可能需要查看XmlReader类。 API比DataSet提供的API稍微难以使用。但是你将获得不立即将整个DOM加载到内存中的好处。
将记录插入数据库
为了满足您的Atomicity要求,您可以使用单个数据库事务,但是您为单个事务处理的大量记录并不理想。您很可能会遇到以下问题:
我建议使用以下内容而不是单个数据库事务:
将数据上传到数据库中的初始暂存区域以执行验证并标记已处理的记录可能很有用。
答案 1 :(得分:0)
使用SSIS,创建和ETL包。
答案 2 :(得分:0)
使用Transactions进行回滚功能,以及处理创建/检查外键的存储过程。