😊

食わず嫌いのBulkCopy(C# SqlClient実装例)

2023/06/14に公開

実装例

https://github.com/panda728/SqlServerBulkCopy

経緯

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に変換するクラスを用意します。

https://gist.github.com/panda728/d20ee688a0d9da0e727604b3b0882ce1
(BulkCopyよりこっちのコード量の方が多い)

これで登録用のクラスの配列に.ToDataTable() できるようになりお手軽に扱えます。

BulkCopyおすすめ

余談ですが、テーブル側にデフォルト値をセットした列を付けることもできます。
(C#側では省略できます。)

1.取込用テーブルにBulkCopyで取り込み
2.ストアドで本番テーブルに一括取り込み

という方法がお気に入りです。

これだとBulkInsertのようにサーバーにファイルを配置しなくてよいのも利点ですね。

Discussion