首页 > 解决方案 > FastMember:指定的参数超出了有效值的范围。参数名称:名称

问题描述

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

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

var records = csv.GetRecords<dynamic>().ToList();

然后我使用 fastmember 的 ObjectReader 来构造数据

using (var reader = ObjectReader.Create(data, copyParameters))
{
     await sbc.WriteToServerAsync(reader);
}

在这个阶段,我收到错误“指定的参数超出了有效值的范围。参数名称:名称”

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

用于测试的小样本 CSV:

DateTime,Column1,Column2,Column3,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

这是来自 csv 阅读器和复制参数的数据

这是完整的代码:

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

标签: c#asp.net-core-1.0csvhelperfastmember

解决方案


在这方面没有进展之后,我决定硬着头皮升级到 .net core 2.1。一旦我再次访问 DataTable,我就能够快速绕过这个问题。


推荐阅读