C# 取得したDatatableから、SQLiteのDBテーブルに一括書き込み

残念ながらテーブルを直接書き込むうまい方法はない

SQLiteデータベースにインポートする大量のデータセットがありますが、Microsoft.Data.Sqliteに一括挿入APIが見つかりません 。ないからです!SQLiteには、データを一括挿入する特別な方法はありません。

Microsoft.Data.Sqliteへの一括挿入

Datatableあるのにな、そのまま一行書けばテーブルが出来ちゃえばいいのにと。

だけどそんなうまい方法はないらしいです。

2つのPrimaryKeyを持ったテーブル作成

using (var con = new SqliteConnection(connectionString))
{
    con.Open();
    using (SqliteCommand command = con.CreateCommand())
    {
        command.CommandText = "create table tm_product(ProductID INTEGER , AtributeCD INTEGER, AtrName TEXT,AtrJun INTEGER,PRIMARY KEY(ProductID,AtributeCD))";
        command.ExecuteNonQuery();
    }

    con.Close();
}

 

参考にしたサイトはこちら

書き込みサンプル

インサートを高速化するため、以下を留意する

  1. トランザクションを使用
  2. 同じINSERTコマンドを再利用
SqliteConnection con = new SqliteConnection(connectionString);
con.Open();
using (var transaction = con.BeginTransaction())
{
    var command = con.CreateCommand();
    command.CommandText =
    @"
        INSERT INTO tm_product (ProductID,AtributeCD,AtrName,AtrJun)
        VALUES ($ProductID,$AtributeCD,$AtrName,$AtrJun)
    ";


    var ProductIDParameter = command.CreateParameter();
    ProductIDParameter.ParameterName = "$ProductID";
    command.Parameters.Add(ProductIDParameter);

    var AtributeCDParameter = command.CreateParameter();
    AtributeCDParameter.ParameterName = "$AtributeCD";
    command.Parameters.Add(AtributeCDParameter);

    var AtrNameParameter = command.CreateParameter();
    AtrNameParameter.ParameterName = "$AtrName";
    command.Parameters.Add(AtrNameParameter);

    var AtrJunParameter = command.CreateParameter();
    AtrJunParameter.ParameterName = "$AtrJun";
    command.Parameters.Add(AtrJunParameter);


    // Insert a lot of data

    foreach(DataRow dr in dt.Rows)
    {
        ProductIDParameter.Value = dr["ProductID"];
        AtributeCDParameter.Value = dr["AtributeCD"];
        AtrNameParameter.Value = dr["AtrName"];
        AtrJunParameter.Value = dr["AtrJun"];
        command.ExecuteNonQuery();
    }

    transaction.Commit();
}
con.Close();

 

条件的には

dtは、他データベースから別で取得したdatatable

結論

620万件のデータをローカルSQLiteに書き込むのに18秒

ファイル容量は 24,824KBになった。