在我的映射文件中使用 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转换是罪魁祸首。我做错了吗?这是一个错误吗?
答案 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)
}