0

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事件用于将先前捕获的值插入到RecordMappingwithFieldNotInFile属性中表示的占位符中。

....
    // 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 转换是罪魁祸首。我做错了吗?这是一个错误吗?

4

1 回答 1

1

您是正确的,ReadFileAsDT()FieldNotInFile包括DataTable. 这可能是一个错误,但老实说,我不确定FieldNotInFile应该如何使用 - 它不在此处的文档中。

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

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

然后,如果您真的需要 a 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)
}
于 2012-10-15T10:32:29.477 回答