2012-09-20 61 views
1

我已经创建了一个将CSV文件导入数据库表的应用程序,并且我有多个CSV文件需要导入到SQL Server数据库的表中。SQL Server数据导入困境

我有几个办法,但我不确定哪一个最实用。该应用程序通过要求用户选择他们想要导入的文件(从他们的本地文件系统),然后他们只需点击一个[Load Files]按钮。这些文件有时可能包含100,000多行。

上述情况会更好吗?

  1. 导入CSV文件导入使用C#和开源GenericParser然后使用BulkCopy的传统方法将数据表推到数据库

    注意数据表:我关心的是用户的PC时的应变为100,000行以上的文件执行此操作。这将如何影响处理过程,还是会使程序崩溃?

  2. 使用批量插入需要文件名和路径。我对这个选项的担心是我不确定服务器是否能够在物理文件不在服务器上的情况下处理Bulk Insert命令?文件路径将与用户本地机器相关。我唯一使用批量插入的时间是当我登录到服务器本身,这是不适用于此应用程序。

  3. 有没有办法与Linq做到这一点?虽然我对Linq不太熟悉,如果可以实现,我很乐意尝试。

任何洞察力的赞赏。我知道我需要做什么,只是不确定如何实际完成它。

感谢

+0

请注意,对于批量插入,MySQL中的'LOAD DATA INFILE'命令有一个--local选项[请参考此处的检查参考文档](http://dev.mysql.com/doc/refman/5.1/en/load- data.html)“--local选项导致mysqlimport从客户端主机读取数据文件” –

+0

@AdolfoPerez感谢您的提示... MySQL是我的下一个数据库来征服这个dataload应用程序。给我另一个问题。 :) – Encryption

回答

1

我的建议是使用SqlBulkCopy类.NET。它将允许您在BULK INSERT语句中几乎一样快地导入行,但只需要用行填充DataTable,然后将它们发送到SQL Server。

您可能想要考虑的另一个问题是(这是我个人最喜欢的简单文件导入程序)使用PowerShell而不是C#,它具有用于存储CSV文件的built-in cmdlet。非常酷的东西。

+0

SQLBulkCopy每当有100,000到200,000行时如何执行?Powershell可能无法在所有使用此应用程序的机器上使用。这是一个便携式/轻量级应用程序。 – Encryption

+0

行不重要。字节很重要。宽度为1个字节的1,000,000行与导入每行1兆字节的100行的表相比,所需的导入时间要少得多。在这些用例中,SQLBulkCopy的性能一直很好。如果你想了解更多的细节,请查阅Alberto对它的研究:http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx –

+0

感谢Dave的建议。得到它的工作很好,性能似乎是可以接受的。当然,在主应用程序上运行独立线程上的大容量副本。 – Encryption

0

1).net中的loader app是一个不错的选择,一般来说。 100,000行实际上不是一个繁重的工作量,特别是对于简单的负载。只有当涉及到大量多表连接才能快速查找数值时,这真的是一个大问题。 2)虽然严格地说物理文件位置只是一个性能问题,但我不会这么做。它会引起行政头痛。

3)我没有Linq的经验,我不能说。

仅用于红利备用的想法:如果你的IIS运行在某个地方,甚至可能在数据库服务器上,你可以打开一个轻量级的单页“webapp”,它只是一个CGI脚本,用户只需以“web/CGI”上传方式提供CSV。这种方式没有实用程序安装在用户工作站上。

0

解决你的问题,你必须看到,在两个基本观点:

  1. 你需要做一些操作与数据插入前到数据库(一些sumarization,校正,...)? 如果是,则这里是从文件上传行到对象(每行到一个对象实例)的最佳方式。而且你可以用Linq优雅地移动项目列表。

  2. 您是否只需要从文件到数据库插入行就像它们一样? 我这种情况下,使用你的问题的第2点中描述的过程。

我宁愿在任何操作之前上传文件到服务器。这更安全。

+0

上传文件到服务器不是一个选项。这必须是一个便携式独立解决方案,不会将用户的权限授予特定的服务器。将有多个服务器必须更新。上传文件需要域权限,但并非总是如此。但是,数据库访问从来不是问题。 – Encryption