SqlBulkCopy 예외에 열 이름 없음

.net exception sqlbulkcopy vb.net

문제

SqlBulkCopy.WriteToServer ()에 전달 된 DataTable에 변환하지 못하는 값이 들어 있으면 변환하지 못한 값을 표시하는 InvalidOperationException이 발생합니다. 열 이름은 내가 말할 수있는 것에서 예외적으로 표시되지 않습니다. 이럴 때 열 이름과 값을 기록하려고합니다. 이 정보를 검색 할 수있는 방법이 있습니까?

System.InvalidOperationException: The given value of type SqlDecimal from the 
    data source cannot be converted to type decimal of the specified target column. 
    ---> System.InvalidOperationException: The given value of type SqlDecimal from 
    the data source cannot be converted to type decimal of the specified target column. 
    ---> System.ArgumentException: Parameter value '9999999999999999999999999999.00' 
    is out of range.

인기 답변

짧은 대답은 아니오라고 생각합니다. SqlBulkCopy가 문제를 일으키는 열을 알려주는 방법이 없습니다.

귀하의 경우에는, 난 당신이. NET 코드의 모든 십진수 열에 자신의 유효성 검사를 추가 할 필요가 있다고 생각합니다. 실패한 수는 소수 자릿수의 왼쪽에 28 자리 숫자를 갖기 때문에 십진수 (28, 0)보다 작은 정밀도를 갖는 SQL C 럼은이 삽입에 실패합니다. SQL에 대한 유효성 검사 .net 소수 자릿수에 관한이 질문을보십시오.

SQL Server의 저장소에 대해 C #의 10 진수 유효성 검사

더 일반적인 의미에서 .net DataTable 열 순서가 SQL 테이블과 일치하지 않으면 유사한 오류가 발생할 수 있습니다. VarcharColumn, IntColumn, DecimalColumn 순서로 열이있는 테이블에서 열의 이름을 지정 했더라도 아래 표에 다음을 삽입 할 수 없습니다.

        DataTable tbl = new DataTable();
        tbl.Columns.Add("IntColumn", Type.GetType("System.Int32"));            
        tbl.Columns.Add("VarcharColumn", Type.GetType("System.String"));                        
        tbl.Columns.Add("DecimalColumn", Type.GetType("System.Decimal"));

위의 C # 열을 다시 정렬하거나 열 매핑을 제공해야합니다.

        SqlBulkCopy blkCpy = new SqlBulkCopy(conn);            
        blkCpy.ColumnMappings.Add("VarcharColumn", "VarcharColumn");
        blkCpy.ColumnMappings.Add("IntColumn", "IntColumn");
        blkCpy.ColumnMappings.Add("DecimalColumn", "DecimalColumn");

다른 하나의 트릭은 특정 행 하나가 삽입되지 않는다는 것을 알고있는 배치를 디버깅하는 경우 SQLBulkCopy의 SQLRowsCopied 이벤트를 사용하여 문제의 원인이되는 행을 식별 할 수 있습니다. 예 :

        SqlBulkCopy blkCpy = new SqlBulkCopy(conn);
        blkCpy.SqlRowsCopied += blkCpy_SqlRowsCopied;
        blkCpy.NotifyAfter = 1;

그런 다음 이벤트 처리기에서 :

    static void blkCpy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
    {
        Console.WriteLine("Copied {0} rows", e.RowsCopied);
    }


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