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;
....
}

エンジンの実行では、2 つのインスタンスを定義しました。最初に単一のヘッダー レコードをキャプチャし、その値を解析します。この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;
....

次に、レコード エンジンが作成されます。このイベントは、以前にキャプチャした値をwith属性BeforeReadRecordで示されたプレースホルダーに挿入するために使用されます。RecordMappingFieldNotInFile

....
    // 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 列は、ID、RptDateFrom、RptDateTo、GenerationDate、RowPrefix などではなく、RowPrefix、Field1、Field2 などとして出力されます。

奇妙なことに、代替方法を使用すると..

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

リスト項目には、RecordMappingすべて正しい値を持つオブジェクトが含まれています。属性の DataTable 変換が原因のようFieldNotInFileです。私はこれを間違っていますか?これはバグですか?

4

1 に答える 1

1

にフィールドがReadFileAsDT()含まれていないことは正しいです。これはバグかもしれませんが、正直なところ、 がどのように使用されることになっているのかわかりません。ここのドキュメントにはありません。FieldNotInFileDataTableFieldNotInFile

Master Detailエンジンを使用するか、代わりに単に実行する方がよいと思います

 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)
}
于 2012-10-15T10:32:29.477 に答える