1

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

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

对于上述情况,什么会更好?

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

    注意:我担心的是在对超过 100,000 行的文件执行此操作时对用户 PC 造成的压力。这将如何影响处理或会使程序崩溃?

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

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

任何见解都值得赞赏。我知道我需要做什么只是不确定如何实际完成它。

谢谢

4

3 回答 3

1

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

您可能要考虑的另一个考虑因素是(这是我个人最喜欢的简单文件导入程序)使用 PowerShell 而不是 C#,它具有用于导入 CSV 文件的内置 cmdlet 。很酷的东西。

于 2012-09-20T17:17:18.540 回答
0

1) .Net 中的加载器应用程序通常是一个不错的选择。100,000 行确实不是一个繁重的工作量,尤其是对于简单的负载。只有当为了动态查找值而涉及大量多表连接时,这才会真正成为一个大问题。

2)虽然严格来说物理文件位置只是一个性能问题,但我不会这样做。它将引入行政难题。

3)我没有使用Linq的经验,我无法评论。

只是为了额外的想法:如果您在某处运行 IIS,甚至可能在数据库服务器上,您可以创建一个轻量级的单页“webapp”,它只是一个 CGI 脚本,具有与数据库的 ODBC 连接,用户只需提供CSV 作为“web/CGI”上传。无需以这种方式在用户工作站上安装实用程序应用程序。

于 2012-09-20T17:24:08.477 回答
0

要解决您的问题,您必须在两个基本视图中查看:

  1. 在插入数据库之前,您是否需要对数据进行一些操作(一些汇总、更正等)?如果是,那么这里是将行从文件上传到对象(每一行到一个对象实例)的最佳方式。并且您可以使用 Linq 优雅地移动项目列表。

  2. 您只需要按原样将行从文件插入到数据库吗?在这种情况下,使用您问题第 2 点中描述的过程。

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

于 2012-09-20T17:33:04.047 回答