3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SqlBulkCopy でエラーとなった行を取得する

Posted at

SqlBulkCopy のエラー情報

SqlBulkCopy を使用すると高速に Bulk Insert を行えるが挿入中にエラーとなったときにエラーとなった行を特定することができない。

using (var copy = new SqlBulkCopy("ConnectionString"))
{
    try
    {
        copy.WriteToServer(dt);
    }
    catch (Exception ex)
    {
        // Exception にはエラーになった行を特定する情報は含まれていない。
    }
}

拡張メソッドの定義

SqlBulkCopy クラスの実装を覗くとプライベートフィールドに処理する行の情報を格納しているので、リフレクションを使って無理やり取れる様にしてみた。※.NET Framework 4.6.1

SqlBulkCopyExtensions.cs
public static class SqlBulkCopyExtensions
{
    private static readonly BindingFlags BindingAttributes = BindingFlags.Instance | BindingFlags.NonPublic;

    public static DataRow GetLastDataRow(this SqlBulkCopy instance)
        => (DataRow)(typeof(SqlBulkCopy).GetField("_currentRow", BindingAttributes).GetValue(instance));

    public static int GetLastIndex(this SqlBulkCopy instance)
        => (int)(typeof(SqlBulkCopy).GetField("_rowsCopied", BindingAttributes).GetValue(instance));
}

使い方

using (var copy = new SqlBulkCopy("ConnectionString"))
{
    try
    {
        copy.WriteToServer(dt);
    }
    catch (Exception ex)
    {
        // エラーになった行の DataRow とインデックスを取得する。
        var errorRow = copy.GetLastDataRow();
        var errorIndex = copy.GetLastIndex();
    }
}
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?