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

问题描述:

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

所以我的问题:有没有人有任何其他想法如何最好地将文本文件导入到通用数据库,或评论我的方法,这将导致更快的导入?

我不能使用第三方库或软件来做到这一点,因为它是一个大项目

+0

你在哪里特别有问题?这个问题很普遍。没有密钥合并数据的问题?或者是使用数据集的机制的问题。另外 - 不知道你的意思是加载一个空的数据库到数据集。 – Ken 2008-10-06 20:10:46

+0

我试图找出从文本中获取数据到数据库中的最佳方式,但我不知道其类型。如果合并是最好的方法,那么如何在没有密钥的情况下完成。 – Fry 2008-10-06 20:30:25

最好的办法是买一个现成的应用程序这样做的部分。

专业Off The Shelf应用程序使用本地驱动程序,并对每种类型的数据源进行微调,以防止它们碰到。这总是在掩护下,所以你看不到它是如何去做的。例如,批量复制用于对付SQL Server; Oracle有一个数据泵。

滚动你自己的问题是,你可以花钱来调整你的应用程序以适应你可能遇到的每种源类型,或者你使用通用的ODBC/ADO /无论是什么驱动程序。

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

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

+0

不幸的是,这是一个更大的程序的药水,所以这不是一个选项 – Fry 2008-10-06 20:07:51

+0

看到我的评论Irongoofy,我其实是这样做,但这是一个全面的,我试图让它更快 – Fry 2008-10-07 02:21:39

试试这个

http://filehelpers.sourceforge.net

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

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

+0

我想加载到数据库中以使它们都是相同的格式,最终目标是将文本加载到数据集中,将其复制到数据库数据集中,然后将该数据插入到数据库中。 – Fry 2008-10-06 20:27:36

不完全是优雅的,但表现可能会更好:

  • 加载整个文件到表中只有一列“行”,只要文本(类似于你现在要做什么地方
  • 使用存储程序裂开等领域,并创建插件
  • 在服务器上执行的插入

当你还在插入每一行seperately,您不会创建相当的很多网络流量。

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

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

嗯,我设法让文本文件的行到数据库数据集中,到目前为止,这个方法似乎更快。我用

Dataset.Tables[x].ImportRow(DataRow) 

当然现在它只是让DataAdapter.Update(Dataset)工作。看网上说是会很有趣......

更新

为DataAdapter.Update命令会通过线插入线做这种方法不会产生更快的结果。

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