首页 > 解决方案 > .NET Core WebApi CSV 文件解析和存储在数据库中

问题描述

我正在使用 .NET Core WebApi 和 EF Core。

我有以下情况:

我的问题:

  1. 检查数据是否存在,需要很长时间(15.000 次 4-5 次检查......)

所以我想创建一些任务来将批处理存储在数据库中(但在 .NET Core WebApi 中)你不能运行后台任务,对吧?

你们将如何实现这一目标?

标签: .netentity-frameworkasp.net-coreasp.net-web-api

解决方案


一种方法是使用SqlBulkCopy将数据上传到临时表中,然后将数据查询到适当的表中。例如:

  1. 创建临时表
await connection.ExecuteAsync(@"CREATE TABLE #TempTable
(
    [X] int NULL,
    [Y] nvarchar(100) NULL,
    [Z] datetime NULL
)", null, transaction);

  1. 创建DataTable和填充 CSV 数据
DataTable table = new DataTable();

dataTable.Columns.Add("X", typeof(int));
dataTable.Columns.Add("Y", typeof(string));
dataTable.Columns.Add("Z", typeof(DateTime));

//foreach csv record...

var row = dataTable.NewRow();

row["X"] = 1;
row["Y"] = "test";
row["Z"] = DateTime.Now;

dataTable.Rows.Add(row);

  1. 执行批量复制
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
    bulkCopy.DestinationTableName = "#TempTable";
    bulkCopy.EnableStreaming = true;

    await bulkCopy.WriteToServerAsync(dataTable);
}
  1. 将临时表中的数据查询到目标表中。 这是您可以执行现有记录检查的地方
  2. 删除临时表
await connection.ExecuteAsync("DROP TABLE #TempTable", null, transaction);

我发现这种方法比 EF 更快地将数据批量导入数据库,同时维护一些业务逻辑。


推荐阅读