2012-10-14 3 views
0

매핑 파일에 FieldNotInFile 특성을 사용할 때 예기치 않은 동작이 나타나는 것으로 나타납니다. 아래 내용을 참조하십시오.FileHelpers : FieldNotInFile 특성이 ReadFileAsDT DataTable 결과의 필드를 완전히 생략합니다.

헤더 레코드에 대한 매핑은 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에 표시된 자리 표시 자에 이전에 캡처 한 값을 삽입하는 데 사용됩니다.

.... 
    // 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의 열 등 이상하게 I는 다른 방법을 사용 ..

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

목록

등 RowPrefix, 필드 1, 필드 2, 그리고 ID, RptDateFrom, RptDateTo, GenerationDate, RowPrefix로서 출력 항목에 올바른 값이 모두 포함 된 RecordMapping 개체가 포함되어 있습니다. FieldNotInFile 특성의 DataTable 번역이 범인 인 것처럼 보입니다. 내가 잘못 했니? 이거 버그 야?

답변

1

ReadFileAsDT()FieldNotInFile 필드가 포함되어 있지 않습니다. DataTable에 입력하십시오. 버그 일 수도 있지만 솔직히 말해서 FieldNotInFile을 어떻게 사용해야하는지 잘 모르겠습니다. 문서에 나와 있지 않습니다. here.

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) 
} 
:

난 당신이 정말 DataTable 필요하면 그때

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

과 일을 당신이 대안으로 Master Detail engine 이상을 사용하는 것이 더 낫다 생각, 같은 뭔가 스스로를 채울

관련 문제