本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^
残念ながらテーブルを直接書き込むうまい方法はない
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(); }
参考にしたサイトはこちら
書き込みサンプル
インサートを高速化するため、以下を留意する
- トランザクションを使用
- 同じ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になった。