1

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

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

我不能使用 3rd 方库或软件来执行此操作,因为它是更大项目的一部分

4

5 回答 5

1

Try this

http://filehelpers.sourceforge.net

....why would you want to load the db into the dataset? Have another database keep track of the uniqueness (if there is such a word). While importing, check if exists in the logging database, if no, then load to Generic Database.

Wait for some other responses to this thread, we may get a better idea.

于 2008-10-06T20:12:06.820 回答
1

Not exactly elegant, but performance may be better:

  • load the whole file into a table with just one column "Line" as long text (similar to what you do now locally
  • use stored procedures to split the fields apart and create the inserts
  • execute the inserts on the server

While you are still inserting each line seperately, you wouldn't create quite as much network traffic.

To elaborate, the original method generates the statements on the client and then executes them on the client, resulting in network traffic for each line. My suggestion would be to generate the statements on the server (in a stored procedure) and have them execute on the server, resulting in no new network traffic.

The "correct" solution would be to use a database specific import tool (like SQL Loader for Oracle). The performance gains are enormous. (We are loading huge tables with 20 million lines in about 5 minutes). But of course, that is not very generic.

于 2008-10-06T21:07:38.970 回答
1

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

Dataset.Tables[x].ImportRow(DataRow)

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

更新

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

于 2008-10-08T18:44:21.083 回答
0

批量插入 dbo.ImportTest 从 'C:\ImportData.txt' WITH (FIELTERMINATOR =',', FIRSTROW = 2)

于 2009-05-29T12:23:43.830 回答
-1

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

专业的现成应用程序使用本机驱动程序并针对它们将遇到的每种类型的数据源进行微调。这总是在幕后,所以你看不到他们是怎么做的。例如,bulkcopy 用于 SQL Server;Oracle 有一个数据泵。

自己滚动的问题是,您可以花钱微调您的应用程序以使用您可能遇到的每种源类型,或者通过使用通用 ODBC/ADO/任何驱动程序对性能造成巨大影响.

归根结底,你最好要么把它从你的产品中去掉,要么只处理你不得不采取的不可避免的缓慢方法。在这种情况下,这意味着对所有内容都使用单个插入语句。

那么,你有多少资金用于开发资源?

于 2008-10-06T20:04:58.393 回答