FileHelpers:FieldNotInFile属性完全省略ReadFileAsDT DataTable结果中的字段

时间:2012-10-14 02:06:53

标签: c# datatable filehelpers

在我的映射文件中使用 FieldNotInFile属性时,我遇到了看似意外的行为。请参阅下面,我已配置的缩写示例。

标题记录的映射是单独定义的,以保持MasterDetail引擎的选项打开:

public class HeaderMapping
{
    public string ID;
    public DateTime RptDateFrom;
    public DateTime RptDateTo;
    public DateTime GenerationDate;
....
}

我想将从标题中检索到的值组合到最终记录结果中,以便使用FieldNotInFile属性指定它们以便稍后添加。

public class RecordMapping
{
    // Values not in source
    [FieldNotInFile()]
    public string ID;
    [FieldNotInFile()]
    public DateTime RptDateFrom;
    [FieldNotInFile()]
    public DateTime RptDateTo;
    [FieldNotInFile()]
    public DateTime GenerationDate;

    // Start values from source
    public string RowPrefix;
    public string Field1;
    public string Field2;
    public string Field3;
....
}

在引擎执行中,我定义了两个实例。第一个捕获单个标头记录并解析其值。 AfterReadRecord事件用于在第一行之后停止引擎。

static void Main(string[] args)
{
    // Extract the header
    FileHelperEngine<HeaderMapping> headerEngine = new FileHelperEngine<HeaderMapping>();
    headerEngine.AfterReadRecord +=
        new FileHelpers.Events.AfterReadHandler<HeaderMapping>(AfterHeaderRead);

    HeaderMapping[] headerRecord = headerEngine.ReadFile(source.FullName);

    // Capture Values
    companyId = headerRecord[0].ID;
    rptDateFrom = headerRecord[0].RptDateFrom;
    rptDateTo = headerRecord[0].RptDateTo;
    generationDate = headerRecord[0].GenerationDate;
....

接下来创建记录引擎。 BeforeReadRecord事件用于将先前捕获的值插入RecordMapping中带有FieldNotInFile属性的占位符。

....
    // Extract the Records
    FileHelperEngine<RecordMapping> recordEngine = new FileHelperEngine<RecordMapping>();
    recordEngine.BeforeReadRecord +=
        new FileHelpers.Events.BeforeReadHandler<RecordMapping>(BeforeThisRecord);

    DataTable outputTable = recordEngine.ReadFileAsDT(source.FullName);
}
....
private static void BeforeThisRecord(EngineBase engine, BeforeReadEventArgs<RecordMapping> e)
{
    e.Record.ID = companyId;
    e.Record.RptDateFrom = rptDateFrom;
    e.Record.RptDateTo = rptDateTo;
    e.Record.GenerationDate = generationDate;
}

outputTable结果不符合预期。标记为FieldNotInFile的字段在DataTable结果中完全省略。调试进程时,BeforeThisRecord方法正确执行并分配适当的值,但这不会反映在输出中。 DataTable列输出为RowPrefix,Field1,Field2等,而不是ID,RptDateFrom,RptDateTo,GenerationDate,RowPrefix等。

奇怪的是,当我使用替代方法时..

List <RecordMapping> recordList = recordEngine.ReadFileAsList(source.FullName);

列表项包含具有所有正确值的RecordMapping个对象。似乎FieldNotInFile属性的DataTable转换是罪魁祸首。我做错了吗?这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

{J} ReadFileAsDT()不包括FieldNotInFile中的DataTable字段,这是正确的。这可能是一个错误,但老实说,我不确定应该如何使用FieldNotInFile - 它不在文档here中。

我认为你最好使用Master Detail engine或者只是做

 RecordMapping[] recordMappings = recordEngine.ReadFile(source.FullName);

然后如果你真的需要一个DataTable,请自行填写:

DataTable outputTable = new DataTable(); // New data table.
outputTable.Columns.Add("ID", typeof(int)); // Add all columns.
outputTable.Columns.Add("RptDateFrom", typeof(DateTime));
outputTable.Columns.Add("RptDateTo", typeof(DateTime));
outputTable.Columns.Add("GenerationDate", typeof(DateTime));
outputTable.Columns.Add("RowPrefix", typeof(String));
outputTable.Columns.Add("Field1", typeof(String));
outputTable.Columns.Add("Field2", typeof(String));
outputTable.Columns.Add("Field3", typeof(String));

foreach (RecordMapping recordMapping in recordMappings)
{
  outputTable.Rows.Add(
    companyId, 
    rptDateFrom, 
    rptDateTo, 
    generationDate, 
    recordMapping.RowPrefix, 
    recordMapping.Field1, 
    recordMapping.Field2, 
    recordMapping.Field3)
}