😊
食わず嫌いのBulkCopy(C# SqlClient実装例)
実装例
経緯
SqlClientで一括登録できると聞いていたものの
ついつい慣れたBulkInesrtコマンドを使っていました。
しかし、いざ使用してみると開発工数が激減
なんといってもC#実装だけで完結できるので実装が容易になりました。
処理概要
SQLServer側に取込用のテーブルを用意します。
create table BulkTable(
ID int,
Name varchar(50)
)
C#側に同じ列名と型のクラスを用意します。
public class BulkTable
{
public int Id { get; set; }
public string Name { get; set; } = "";
}
そしてデータを用意して
var rs = new BulkTable[]
{
new BulkTable(){ Id = 1, Name = "One"},
new BulkTable(){ Id = 2, Name = "Two"},
};
あとはBulkCopyコマンドを呼ぶだけです。
using var conn = new SqlConnection(connString);
conn.Open();
using var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default);
bulkCopy.DestinationTableName = "BulkTable";
bulkCopy.WriteToServer(rs.ToDataTable());
DataTable変換
BlukCopyにデータを渡すにはDataTableが必要です。
なのでC#のクラスからDataTableに変換するクラスを用意します。
(BulkCopyよりこっちのコード量の方が多い)
これで登録用のクラスの配列に.ToDataTable() できるようになりお手軽に扱えます。
BulkCopyおすすめ
余談ですが、テーブル側にデフォルト値をセットした列を付けることもできます。
(C#側では省略できます。)
1.取込用テーブルにBulkCopyで取り込み
2.ストアドで本番テーブルに一括取り込み
という方法がお気に入りです。
これだとBulkInsertのようにサーバーにファイルを配置しなくてよいのも利点ですね。
Discussion