【问题标题】:Bulk insert to SQL Server from Excel / CSV从 Excel / CSV 批量插入到 SQL Server
【发布时间】:2020-11-09 00:36:46
【问题描述】:

我需要从 Excel 或 CSV 文件批量插入 SQL Server 数据。数据接近 100k 行。我正在使用 C#/.NET。在 Microsoft 文档中,我发现:

BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (FORMAT = 'CSV'
  , FIRSTROW=2
  , FIELDQUOTE = '\'
  , FIELDTERMINATOR = ';'
  , ROWTERMINATOR = '0x0a');

BULK INSERT (Transact-SQL)

如果我有一个 Excel 文件,我可以将其转换为 CSV 并使用它。这很好用而且效率很高,但我的问题是我无法访问 SQL 服务器上的文件系统。有没有人知道解决这个问题的最佳方法是什么,或者是否有更好的完全不同的方法?

【问题讨论】:

  • 为了能够从文件中BULK INSERT,SQL Server 服务帐户必须有权访问文件所在的位置;如果没有,它就无法访问它。您需要将文件放置/复制到服务帐户可以访问的位置,让服务帐户访问文件当前所在的位置(可能不明智,具体取决于您的企业的数据隐私政策和该帐户当前的权限如何),或者创建一个新共享,您可以在其中放置需要批量加载的文件并授予服务帐户访问该新共享的权限。
  • 请注意,您也可以直接从 xls(x) 文件中读取,而无需使用 OPENROWSET 将其转换为 CSV。
  • 如果您想使用 C# 构建一个简单的程序来导入您的 CSV 文件,那么您可以使用带有通用 CSV 文件阅读器库的 SqlBulkCopy 类
  • 只使用 EF 和 list 怎么样?

标签: c# .net sql-server excel csv


【解决方案1】:

您可以试用SqlBulkCopy,让您可以使用DataTable 将数据直接插入数据库。

更多信息可以在这里找到:SqlBulkCopy.WriteToServerAsync

【讨论】:

    【解决方案2】:

    我看到这个问题,比如客户端出于某种原因想要将数据加载到其中一个数据库表中。

    • 如果他们需要自动化这个过程,或者他们需要如此频繁地执行这个过程,或者需要一次处理多个文件,我会要求客户将 CVS 文件或 Excel 文件复制到一个服务器文件夹,当他们想要导入数据库时​​。

    然后我会写一个文件夹来监视 .NET 应用程序,它会 阅读 CVS 或 Excel 文件并将数据导入数据库表。 如果无法加载数据,则应将文件移动到带有错误日志的“错误文件”文件夹。如果成功,应用程序会将该文件移动到“已完成文件”。

    这种方法的优点。

    • 多个用户可以使用此功能将数据上传到服务器。
    • 用户机器不需要任何类型的安装。
    • 对文件夹的访问完全由 AD 管理。

    缺点

    • 这是处理此类用例的一种旧方法。
    • 用户需要手动检查日志或服务器文件夹以了解文件的状态。

    技术参考

    【讨论】:

      【解决方案3】:

      使用 SQLBulkCopy 似乎是一个很好的解决方案,正如它所解释的那样

      here

      这里我们有这样做的建议:

      var lines = System.IO.File.ReadAllLines(@"d:\data.txt");
      if (lines.Count() == 0) return;
      var columns = lines[0].Split(',');
      var table = new DataTable();
      foreach (var c in columns)
          table.Columns.Add(c);
      
      for (int i = 1; i < lines.Count() - 1; i++)
          table.Rows.Add(lines[i].Split(','));
      
      var connection = @"your connection string";
      var sqlBulk = new SqlBulkCopy(connection);
      sqlBulk.DestinationTableName = "Table1";
      sqlBulk.WriteToServer(table);
      

      这非常有效,通过使用此代码,我可以在不到 5 秒的时间内插入 100.000 条记录,这是完全可以接受的性能。 SQL 服务器本身上的直接 SQL 批量插入当然更快,并且几乎可以立即插入数据,但是在我的情况下这是不可能的,我们在这里有一个不错的选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-03
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        相关资源
        最近更新 更多