SQLiteデータベースにインポートする大量のデータセットがありますが、Microsoft.Data.Sqliteに一括挿入APIが見つかりません 。ないからです!SQLiteには、データを一括挿入する特別な方法はありません。
Microsoft.Data.Sqliteへの一括挿入
Datatableあるのにな、そのまま一行書けばテーブルが出来ちゃえばいいのにと。
だけどそんなうまい方法はないらしいです。
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();
}
参考にしたサイトはこちら
インサートを高速化するため、以下を留意する
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になった。