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();
}
}