2017-11-17 2 views
0

SqlBulkCopy를 사용하는 프로젝트의 일부로 IDataReader를 사용하여 클래스를 구현했습니다. 내가 SqlBulkCopy의와 IDataReader에 WriteToServer 방법을 실행IDataReader 구현의 인덱스 값 문제

SqlBulkCopy bulkInsert = new SqlBulkCopy(Constants.DBConnection, SqlBulkCopyOptions.UseInternalTransaction); 
bulkInsert.BatchSize = 500; 
bulkInsert.DestinationTableName = Constants.DestinationTable; 
bulkInsert.WriteToServer(reader); 

를 사용하여 관련 여기에 코드

public bool Read() 
{ 
    var result = !fileStream.EndOfStream; 
    if (result) 
    { 
     delimRow = fileStream.ReadLine();  
     splitRowValues = delimRow.Split(_delimiters); 
     readRowCount++; 
    }  
    return result; 
} 

private string[] Row 
{ 
    get { return splitRowValues; } 
} 

public object GetValue(int i) 
{ 
    return Row[i]; 
} 

코드의 일부를 게시, 나는 GetValue()에 대한 첫 번째 호출로 시작 것으로 나타났습니다 색인 값을 1로 지정하고 색인의 최종 값은 열 수보다 작은 값을 갖습니다. 이 문제로 인해 대량로드가 하나의 열을 건너 뛰게됩니다.

GetValue()의 인덱스가 1에서 열 수까지의 값을 가지지 않는 이유를 찾을 수 없습니다. 실제로 값은 0부터 시작하여 열 개수보다 작아야합니다. 아무도 내가 원인을 찾을 수 있도록 도와 주시면 알려주세요.

답변

0

매핑을 지정하지 않았습니다. 따라서 기본적으로 SqlBulkCopy은 데이터베이스와 함께 서수로 자동 매핑을 시도 할 수 있습니다.

예를 들어 데이터베이스의 첫 번째 열이 ID 열 (해당 될 가능성이 높음) 인 경우 index 0을 건너 뛰고 대신 index 1으로 시작합니다.

+1

굉장! 그것이 이유였습니다. 확인하기 위해 ID 열을 제거했으며 이제 인덱스 값은 0에서 시작하여 모든 열을 통과합니다. SqlBulkCopy가 추측 작업을하지 않도록 열 매핑을 추가했습니다. – wired2code