パラメータを使用した簡単な挿入
プロジェクトは次のアセンブリを参照する必要があります:Npgsql
。この参照がVisualStudio内に表示されない場合 、次に:
- コネクタのインストールフォルダを参照
- 実行:
GACInstall.exe
- VisualStudioを再起動します 。
サンプルテーブル
CREATE TABLE "OrderHistory"
(
"OrderId" bigint NOT NULL,
"TotalAmount" bigint,
CONSTRAINT "OrderIdPk" PRIMARY KEY ("OrderId")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "OrderHistory"
OWNER TO postgres;
GRANT ALL ON TABLE "OrderHistory" TO postgres;
GRANT ALL ON TABLE "OrderHistory" TO public;
ALTER TABLE "OrderHistory" ALTER COLUMN "OrderId" SET (n_distinct=1);
GRANT SELECT("OrderId"), UPDATE("OrderId"), INSERT("OrderId"), REFERENCES("OrderId") ON "OrderHistory" TO public;
GRANT SELECT("TotalAmount"), UPDATE("TotalAmount"), INSERT("TotalAmount"), REFERENCES("TotalAmount") ON "OrderHistory" TO public;
サンプルコード
必ず次のディレクティブを使用してください:
using Npgsql;
using NpgsqlTypes;
メソッドに次のソースコードを入力します:
// Make sure that the user has the INSERT privilege for the OrderHistory table.
NpgsqlConnection connection = new NpgsqlConnection("PORT=5432;TIMEOUT=15;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=20;COMMANDTIMEOUT=20;COMPATIBLE=2.2.4.3;DATABASE=test;HOST=127.0.0.1;PASSWORD=test;USER ID=test");
connection.Open();
DataSet dataSet = new DataSet();
NpgsqlDataAdapter dataAdapter = new NpgsqlDataAdapter("select * from OrderHistory where OrderId=-1", connection);
dataAdapter.InsertCommand = new NpgsqlCommand("insert into OrderHistory(OrderId, TotalAmount) " +
" values (:a, :b)", connection);
dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("a", NpgsqlDbType.Bigint));
dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("b", NpgsqlDbType.Bigint));
dataAdapter.InsertCommand.Parameters[0].Direction = ParameterDirection.Input;
dataAdapter.InsertCommand.Parameters[1].Direction = ParameterDirection.Input;
dataAdapter.InsertCommand.Parameters[0].SourceColumn = "OrderId";
dataAdapter.InsertCommand.Parameters[1].SourceColumn = "TotalAmount";
dataAdapter.Fill(dataSet);
DataTable newOrders = dataSet.Tables[0];
DataRow newOrder = newOrders.NewRow();
newOrder["OrderId"] = 20;
newOrder["TotalAmount"] = 20.0;
newOrders.Rows.Add(newOrder);
DataSet ds2 = dataSet.GetChanges();
dataAdapter.Update(ds2);
dataSet.Merge(ds2);
dataSet.AcceptChanges();
connection.Close();
パフォーマンスについての考え
元の投稿では、パフォーマンス要件については言及されていませんでした。ソリューションは次の条件を満たしている必要があります。
-
DataTable
を使用して挿入します - ループを使用せずにデータを挿入する
大量のデータを挿入する場合は、パフォーマンスオプションを確認することをお勧めします。 Postgres ドキュメントはあなたを示唆しています:
- 自動コミットを無効にする
-
COPY
を使用します コマンド - インデックスを削除する
- 外部キー制約を削除する
- など
Postgresインサートの最適化の詳細については、以下をご覧ください。
また、システムのパフォーマンスに影響を与える可能性のある他の多くの要因があります。高レベルの紹介については、以下をご覧ください:
- ADO.NETSQLServerのパフォーマンスのボトルネック
- この投稿では、パフォーマンスを最適化するための一般的な(つまり、SQLServer以外の)戦略の概要を説明しています。
その他のオプション
- .NETコネクタはPostgresをサポートしていますか
Copy
コマンド?- そうでない場合は、ソースコード
をダウンロードできます。
Npgsql
の場合 コネクタを使用して、独自のBulkCopy()
を追加します 方法。最初にソースコードのライセンス契約を確認してください。
- そうでない場合は、ソースコード
をダウンロードできます。
- Postgresかどうかを確認します テーブル値パラメータをサポート 。
- このアプローチでは、テーブルを
Postgres
に渡すことができます。 データを宛先に直接挿入できる関数。
- このアプローチでは、テーブルを
- Postgresを購入する 必要な機能を含むベンダーの.NETコネクタ。
追加の参照
- Postgres.NETコネクタ -無料 &オープンソース