首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:“FileId”字段标头未找到。参数名称:名称

错误:“FileId”字段标头未找到。参数名称:名称
EN

Stack Overflow用户
提问于 2019-10-07 16:36:38
回答 1查看 563关注 0票数 1

我是CsvHelper新手,如果我错过了文档中的一些内容,我很抱歉。

我有一个CSV文件,有200列。通常会有近65000行。将这些行导入很好,直到我在中添加了一个名为"FileId“的新字段-- CSV中不存在该字段。我想注入这个领域和相关的价值。

请问我该怎么做?

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

代码语言:javascript
复制
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(String名称)( System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerCommon(Int32 columnCount ),System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount),System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader阅读器(System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader阅读器),Haitong.Test.CsvImporter.Program.Main(String[] args),C:\Development\Workspaces\UK OPS数据仓库\UK OPS数据仓库\UK OPS Data Warehouse\Haitong.Test.CsvImporter\Program.cs:line 86

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-07 18:39:30

您可以通过将CSV数据加载到DataTable中,向表中添加一个默认值的FileId列,并将DataTable传递到SqlBulkCopy中来解决这个问题。看起来,当前的解决方案并没有将整个文件加载到内存中,因此,如果您尝试这种方法,应该监视内存的使用情况。如果您深入了解CsvReader的Columns属性的文档,您可能能够让当前的解决方案工作。它看起来不像你试图使用它的方式。

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

代码语言:javascript
复制
        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);
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58273722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档