.net - .NET Core WebApi CSV 文件解析和存储在数据库中
问题描述
我正在使用 .NET Core WebApi 和 EF Core。
我有以下情况:
- 我有一个接受 CSV 文件的端点
- 此 CSV 文件包含超过 15.000 行
- 我需要解析这个 CSV 文件并将每一行存储在我的数据库中
- 在存储每一行之前,我需要检查里面的数据是否已经存在(如果它们作为独立实体存在,则需要检查每行 4-5 个值)
我的问题:
- 检查数据是否存在,需要很长时间(15.000 次 4-5 次检查......)
所以我想创建一些任务来将批处理存储在数据库中(但在 .NET Core WebApi 中)你不能运行后台任务,对吧?
你们将如何实现这一目标?
解决方案
一种方法是使用SqlBulkCopy将数据上传到临时表中,然后将数据查询到适当的表中。例如:
- 创建临时表
await connection.ExecuteAsync(@"CREATE TABLE #TempTable
(
[X] int NULL,
[Y] nvarchar(100) NULL,
[Z] datetime NULL
)", null, transaction);
- 创建
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);
- 执行批量复制
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
bulkCopy.DestinationTableName = "#TempTable";
bulkCopy.EnableStreaming = true;
await bulkCopy.WriteToServerAsync(dataTable);
}
- 将临时表中的数据查询到目标表中。 这是您可以执行现有记录检查的地方。
- 删除临时表
await connection.ExecuteAsync("DROP TABLE #TempTable", null, transaction);
我发现这种方法比 EF 更快地将数据批量导入数据库,同时维护一些业务逻辑。
推荐阅读
- python - 在 groupby 熊猫对象上应用 rolling() 时,多索引重复
- java - 使用 mysql jdbc 快速获取结果集
- azure - redis 的理想值大小范围是多少?100KB 是不是太大了?
- .net-core - 尽管已安装,但我的 VS2017 安装中缺少 .net core 2.2
- python - 警告 - 此实例的状态已在外部设置为成功。服用毒丸
- javascript - 如何在不重新加载的情况下使用 [routerLink] 和 target="_blank" 导航到内部页面?
- visual-studio - IDE 主题的通用样式编辑器
- python - 如何正确处理 Python 中的浮点运算?
- r - 使用 Kable 将带有包装文本的列名称居中
- android - 蓝牙 setPin Android 9 Pie 不再工作