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コードのすべての10進数の列に独自の検証を追加する必要があると思います。失敗した数値は小数点の左側に28桁ありますので、小数点以下(28,0)より小さい精度のSQL列はこの挿入に失敗します。 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は合法ですか? はい、理由を学ぶ