错误:找不到“ FileId”字段标题。参数名称:名称

时间:2019-10-07 16:36:38

标签: c# lumenworks

我是CsvHelper的新手,如果我错过了文档中的内容,我深表歉意。

我有一个包含200个关闭列的CSV文件。通常,将有接近65000行。将这些行导入到SQL数据库表中就可以了,直到我在SQL数据库表中添加了一个名为“ FileId”的新字段-CSV文件中不存在该字段。我希望注入此字段及其相关值。

我该怎么做?

请参见下面我正在使用的代码:

const string fileToWorkWith = @"C:\Data\Fidessa ETP Files\Import\2019\myCsvFile.csv";
Output.WriteLn($"Working with file {fileToWorkWith}.");

const string databaseConnectionString = "Server=MyServer;Database=DB;User Id=sa; Password = xyz;";

Output.WriteLn($"Checking if working file exists.");

if (new System.IO.FileInfo(fileToWorkWith).Exists == false)
{
    Output.WriteLn("Working file does not exist.", Output.WriteTypes.Error);
    return;
}

Output.WriteLn("Reading file.");
using (var reader = new CsvReader(new StreamReader(fileToWorkWith), true, char.Parse(",") ))
{
    reader.Columns = new List<LumenWorks.Framework.IO.Csv.Column>
    {
        new LumenWorks.Framework.IO.Csv.Column { Name = "FileId", Type = typeof(int), DefaultValue = "1" },
    };
    reader.UseColumnDefaults = true;

    Output.WriteLn("Checking fields in file exist in the Database.");
    foreach (var fieldName in reader.GetFieldHeaders())
    {

        if (Fields.IsValid(fieldName.Replace(" ","_")) == false)
        {
            Output.WriteLn($"A new field named {fieldName} has been found in the file that does not exist in the database.", Output.WriteTypes.Error);
            return;
        }
    }

    using (var sbc = new SqlBulkCopy(databaseConnectionString))
    {
        sbc.DestinationTableName = "FidessaETP.tableARC_EventsOrderAndFlow_ImportTest";
        sbc.BatchSize = 1000;

        Output.WriteLn("Mapping available Csv Fields to DB Fields");
        foreach (var field in reader.GetFieldHeaders().ToArray())
        {
            sbc.ColumnMappings.Add(field, field.Replace(" ", "_"));
        }

        sbc.WriteToServer(reader);
    }    
}

错误详细信息

消息: 找不到“ FileId”字段标题。参数名称:名称

来源: LumenWorks.Framework.IO

堆栈跟踪:

  

System.ArgumentException:找不到“ FileId”字段标头。参数   名称:的名称   LumenWorks.Framework.IO.Csv.CsvReader.System.Data.IDataRecord.GetOrdinal(字符串   名称)   System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerCommon(Int32   columnCount)在   System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32   columnCount,CancellationToken ctoken)   System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader reader)在   Haitong.Test.CsvImporter.Program.Main(String [] args)在   C:\ Development \ Workspaces \ UK OPS数据仓库\ UK OPS数据   Warehouse \ Haitong.Test.CsvImporter \ Program.cs:第86行

1 个答案:

答案 0 :(得分:0)

通过将CSV数据加载到DataTable中,将具有默认值的FileId列添加到表中并将DataTable传递到SqlBulkCopy中,您也许可以解决该问题。看起来您当前的解决方案似乎没有将整个文件加载到内存中,因此,如果尝试这种方法,则应该监视内存使用情况。如果您浏览CsvReader的Columns属性的文档,则可能可以使当前的解决方案正常工作。看起来它不符合您尝试使用它的方式。

下面是一个示例,您可以使用DataTable加载文件:

        DataTable csvTable = new DataTable();
        using (var reader = new StreamReader("path\\to\\file.csv"))
        {
            using (var csv = new CsvReader(reader, true))
            {
                csvTable.Load(csv);
            }
        }

        DataColumn newColumn = new DataColumn("FileId", typeof(System.Int32));
        newColumn.DefaultValue = 1;
        csvTable.Columns.Add(newColumn);

        using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString))
        {
            sbc.WriteToServer(csvTable);
        }