我正在尝试使用CsvHelper导入CSV文件并将其写入我的SQL数据库。导入的数据不属于任何预定义的类,必须在运行时确定。许多论坛指出使用FastMember来做这件事,但我无法让它发挥作用。
由于我没有预定义的类,我正在使用以下代码阅读CSV:
var records = csv.GetRecords<dynamic>().ToList();
然后我使用fastmember的ObjectReader来构建数据
using (var reader = ObjectReader.Create(data, copyParameters))
{
await sbc.WriteToServerAsync(reader);
}
在此阶段,我收到错误&#34;指定的参数超出了有效值的范围。参数名称:name&#34;
我将在下面包含整个代码段,但copyParameters是一个字符串数组,其中包含与CSV中显示的完全相同的所有列。
用于测试的小样本CSV:
日期时间,列1,列2,栏3,Column4 1/8/2014 18:20,1,0,0.3,0 1/8/2014 18:21,1,0,0.3,0 1/8/2014 18:22,1,0,0.2,0 1/8/2014 18:23,1,0,0.2,0 1/8/2014 18:24,1,0,0.2,0 1/8/2014 18:25,1,0,0.2,0
以下是完整的代码:
public async Task InsertTimeDataFromImport(IFormFile file, List<ImportCurveGridViewModel> curves, string tableName)
{
try
{
using (var reader = new StreamReader(file.OpenReadStream()))
{
var csv = new CsvReader(reader);
csv.Configuration.HasHeaderRecord = true;
csv.Read();
var records = csv.GetRecords<dynamic>().ToList();
var copyParameters = curves
.Where(c => c.Import)
.Select(c => c.CurveName)
.ToArray();
var batchSize = records.Count();
await _repository.InsertData(tableName, batchSize, records, copyParameters);
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
throw;
}
}
public async Task InsertData(string tableName, int batchSize, IEnumerable<dynamic> data, string[] copyParameters)
{
using (SqlBulkCopy sbc = new SqlBulkCopy(_context.Database.GetDbConnection().ConnectionString, SqlBulkCopyOptions.KeepIdentity))
{
sbc.DestinationTableName = "[" + tableName + "]";
sbc.BatchSize = 5000;
foreach (var param in copyParameters)
{
sbc.ColumnMappings.Add(param, param);
}
using (var reader = ObjectReader.Create(data, copyParameters))
{
await sbc.WriteToServerAsync(reader);
}
}
}
答案 0 :(得分:0)
在此方面没有任何进展之后,我决定硬着头皮升级到.net core 2.1。一旦我再次访问DataTable,便能够快速规避此问题。