私はSQL Server 2014のテーブルにレコードを挿入するために次のコードを使用しています
using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["myConnString"]))
{
conn.Execute("INSERT statement here", insertList);
}
これはinsertList
100 万項目あるリストです。この挿入を i5 デスクトップでテストしたところ、同じマシン上の SQL Server に 100 万レコードを挿入するのに約 65 分かかりました。Dapper がバックグラウンドでどのように挿入を実行しているのかはわかりません。データベース接続を 100 万回開いたり閉じたりするのは絶対に避けたいものです。
これは Dapper で一括挿入を行うための最良の方法でしょうか、それとも他の方法を試すか、Enterprise ライブラリを使用して単純な ADO.Net を使用するべきでしょうか?
編集
後から考えると、ADO.Net を使用する方がよいことはわかっているので、質問を言い換えます。これが Dapper で実行できる最善の方法なのか、それとも Dapper 自体で実行できるより良い方法を見逃しているのかを知りたいです。
ベストアンサー1
Ehsan Sajjadのコメントに基づいて、方法の1つは、READONLYパラメータを持つストアドプロシージャを書くことです。ユーザー定義の TABLE 型。
たとえば、名と姓で構成される連絡先を一括挿入したい場合は、次のようにします。1) テーブル タイプを作成します。
CREATE TYPE [dbo].[MyTableType] AS TABLE(
[FirstName] [varchar](50) NULL,
[LastName] [varchar](50) NULL
)
GO
2) 次に、上記のテーブル タイプを使用するストアド プロシージャを作成します。
CREATE PROC [dbo].[YourProc]
/*other params here*/
@Names AS MyTableType READONLY
AS
/* proc body here
*/
GO
3) .NET 側では、パラメータを System.Data.SqlDbType.Structured として渡します。これは通常、メモリ内のデータ テーブルを作成し、それに行を追加して、この DataTable オブジェクトを @Names パラメータとして使用することを意味します。注: DataTable はメモリを大量に消費すると考えられています。コードを慎重にプロファイリングして、サーバー上でリソースの問題が発生しないように注意してください。
代替ソリューションここで概説したアプローチを使用します。https://stackoverflow.com/a/9947259/190476このソリューションは DELETE 用ですが、挿入や更新にも適用できます。