使用SQL将文本文件导入通用数据库

时间:2008-10-06 20:03:16

标签: sql database csv import oledb

我目前正在尝试使用OleDb将分号分隔的文本文件导入到c#中的数据库中,我不知道其类型(SQL Server,Access,Oracle,MySQL,postgreSQL等)。目前我是使用Jet文本阅读器在文件中读取数据库,然后创建准备好的插入语句,填充字段,然后在最后提交。虽然这样做有效,但速度很慢,而且对于数百万行,它需要的时间太长。

所以我的问题:是否有人对如何最好地将文本文件导入通用数据库有任何其他想法,或者对我的方法进行评论会导致更快的导入?

我无法使用第三方库或软件来执行此操作,因为它是较大项目的一部分

5 个答案:

答案 0 :(得分:1)

试试这个

http://filehelpers.sourceforge.net

....为什么要将数据库加载到数据集中?让另一个数据库跟踪唯一性(如果有这样的话)。导入时,检查日志数据库中是否存在,如果不存在,则加载到通用数据库。

等待对此主题的其他一些回复,我们可能会有更好的想法。

答案 1 :(得分:1)

不完全优雅,但性能可能更好:

  • 将整个文件加载到一个表中,只有一列“Line”作为长文本(类似于您现在在本地执行的操作
  • 使用存储过程将字段拆分并创建插入
  • 执行服务器上的插入

当你仍然单独插入每一行时,你不会创建相当多的网络流量。

详细说明,原始方法在客户端上生成语句,然后在客户端上执行它们,从而导致每行的网络流量。我的建议是在服务器上生成语句(在存储过程中)并让它们在服务器上执行,从而不会产生新的网络流量。

“正确”的解决方案是使用特定于数据库的导入工具(如SQL Loader for Oracle)。性能提升是巨大的。 (我们在大约5分钟内装载了2000万行的大表)。但当然,这不是很通用。

答案 2 :(得分:1)

好吧,我设法将文本文件的行放到数据库数据集中,到目前为止,这种方法似乎更快。我用了

Dataset.Tables[x].ImportRow(DataRow)

当然现在只是让DataAdapter.Update(数据集)工作。在网上看起来会很有趣......

更新

此方法不会产生更快的结果,因为DataAdapter.Update命令会逐行插入。

答案 3 :(得分:0)

BULK INSERT dbo.ImportTest FROM'C:\ ImportData.txt' WITH(FIELDTERMINATOR =',',FIRSTROW = 2)

答案 4 :(得分:-1)

您最好的选择是购买现成的应用程序。

Professional Off The Shelf应用程序使用本机驱动程序并对它们将要遇到的每种类型的数据源进行微调。这总是在幕后,所以你不会看到他们如何去做。例如,批量复制用于SQL Server; Oracle有一个数据泵。

滚动自己的问题是,您可以花钱来微调您的应用程序以使用您可能遇到的每种源类型,或者通过使用通用ODBC / ADO获得巨大的性能损失/无论是什么驱动因素。

在一天结束时,您最好不要将其从产品中取出,或者只是处理您不得不采取的不可避免的慢速方法。在这种情况下,这意味着对所有内容使用单个插入语句。

那么,您对开发资源有多少钱?