데이터베이스에 대한 요청이 끝난 행 번호를 오류와 함께 가져옵니다.

c# reflection sqlbulkcopy sql-server

문제

이 코드를 사용하여 SQL 요청을 보냅니다.

 SqlBulkCopy bulkCopy = new SqlBulkCopy(Connection);

 foreach (DataColumn column in dt.Columns)
 {
     bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
 }

 bulkCopy.DestinationTableName = "nsi." + classifierData.Info.TableName;
 bulkCopy.WriteToServer(dt);

이 예외가 발생합니다.

colid에 대해 bcp 클라이언트에서 유효하지 않은 열 길이를 받았습니다.

어떤 행이 오류의 원인인지 식별 ​​할 수있는 방법이 있습니까?

나는 이것을 사용하려고 시도했지만 작동하지 않는다 (값은 항상 같다) :

 FieldInfo currentRow = typeof(SqlBulkCopy).GetField("_currentRowLength", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 var currentRowNumber = currentRow.GetValue(bulkCopy);

 FieldInfo _rowsCopiedField = typeof(SqlBulkCopy).GetField("_rowsCopied", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 var currentRowN = _rowsCopiedField.GetValue(bulkCopy);

제발, 누구 도와주세요 ...

수락 된 답변

순전히 SqlBulkCopy 에서 오류가있는 행을 식별하는 유일한 방법은 NotifyAfter 속성 + SqlRowsCopied 이벤트 + BatchSize = 1을 사용하는 것입니다.

이제부터는 성공적으로 복사 된 모든 행에 대해 증가하는 Index 속성을 쉽게 가질 수 있으며 오류가있는 인덱스를 찾을 수 있습니다.

예를 들어, 오류가 발생하고 다시 NotifyAfter = 1 로 시도합니다.

bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.NotifyAfter = 1;
bulkCopy.BatchSize = 1;

분명히 최고의 성능 현명한 솔루션이 아니지만 귀하의 정보를 찾을 수 있습니다.

편집 : 답변 코멘트

죄송 합니다만 오류가있는 행 - 열 값을 가져올 수 있습니까?

나는 그렇게 생각하지 않는다. 어떤 열에 오류 메시지에 문제가 있는지 정확하게 알 수 없습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.