C# FastMember:指定的参数超出有效值的范围。参数名称:name

C# FastMember:指定的参数超出有效值的范围。参数名称:name,c#,asp.net-core-1.0,csvhelper,fastmember,C#,Asp.net Core 1.0,Csvhelper,Fastmember,我正在尝试使用导入CSV文件并将其写入我的SQL数据库。导入的数据不属于任何预定义类,必须在运行时确定。很多论坛都指向使用FastMember来做这件事,但我一直无法让它工作 由于我没有预定义的类,因此我正在使用以下代码阅读CSV: var records = csv.GetRecords<dynamic>().ToList(); 在这个阶段,我得到错误“指定的参数超出了有效值的范围。参数名:name” 我将在下面包含整个代码段,但是copyParameters是一个字符串数组,包

我正在尝试使用导入CSV文件并将其写入我的SQL数据库。导入的数据不属于任何预定义类,必须在运行时确定。很多论坛都指向使用FastMember来做这件事,但我一直无法让它工作

由于我没有预定义的类,因此我正在使用以下代码阅读CSV:

var records = csv.GetRecords<dynamic>().ToList();
在这个阶段,我得到错误“指定的参数超出了有效值的范围。参数名:name”

我将在下面包含整个代码段,但是copyParameters是一个字符串数组,包含与CSV中显示的列完全相同的所有列

用于测试的小样本CSV:

日期时间,第1列,第2列,第3列,第4列 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 2014年1月8日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);
            }
        }
    }
公共异步任务InsertTimeDataFromImport(IFormFile文件、列表曲线、字符串表名)
{
尝试
{
使用(var reader=newstreamreader(file.OpenReadStream()))
{
var csv=新的CsvReader(读卡器);
csv.Configuration.HasHeaderRecord=true;
csv.Read();
var records=csv.GetRecords().ToList();
变量参数=曲线
.其中(c=>c.Import)
.选择(c=>c.CurveName)
.ToArray();
var batchSize=records.Count();
wait_repository.InsertData(表名、批大小、记录、copyParameters);
}
}
捕获(例外e)
{
系统.诊断.调试.写线(e.Message);
投掷;
}
}
公共异步任务InsertData(字符串tableName、int batchSize、IEnumerable数据、字符串[]copyParameters)
{
使用(SqlBulkCopy sbc=newsqlbulkcopy(_context.Database.GetDbConnection().ConnectionString,SqlBulkCopyOptions.KeepIdentity))
{
sbc.DestinationTableName=“[”+表名+“]”;
sbc.BatchSize=5000;
foreach(copyParameters中的var param)
{
sbc.ColumnMappings.Add(param,param);
}
使用(var reader=ObjectReader.Create(数据、copyParameters))
{
等待sbc.WriteToServerAsync(读卡器);
}
}
}

在这方面没有进展后,我决定咬紧牙关,升级到.net core 2.1。一旦我再次访问DataTable,我就能够很快地绕过这个问题

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);
            }
        }
    }