0

我需要从 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');

批量插入 (Transact-SQL)

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

4

3 回答 3

0

您可以尝试一下SqlBulkCopy,允许您通过使用DataTable.

可以在此处找到更多信息:SqlBulkCopy.WriteToServerAsync

于 2020-07-19T19:39:01.353 回答
0

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

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

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

这种方法的优点。

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

坏处

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

技术参考

于 2020-07-19T18:45:34.737 回答
-1

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

这里

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

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 批量插入当然更快,并且几乎可以立即插入数据,但是在我的情况下这是不可能的,我们在这里有一个不错的选择。

于 2020-07-19T21:37:08.280 回答