sql >> データベース >  >> RDS >> PostgreSQL

DataTableバルクの値全体をpostgreSQLテーブルに挿入します

    パラメータを使用した簡単な挿入

    プロジェクトは次のアセンブリを参照する必要があります:Npgsql 。この参照がVisualStudio内に表示されない場合 、次に:

    1. コネクタのインストールフォルダを参照
    2. 実行:GACInstall.exe
    3. 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();
    

    パフォーマンスについての考え

    元の投稿では、パフォーマンス要件については言及されていませんでした。ソリューションは次の条件を満たしている必要があります。

    1. DataTableを使用して挿入します
    2. ループを使用せずにデータを挿入する

    大量のデータを挿入する場合は、パフォーマンスオプションを確認することをお勧めします。 Postgres ドキュメントはあなたを示唆しています:

    • 自動コミットを無効にする
    • COPYを使用します コマンド
    • インデックスを削除する
    • 外部キー制約を削除する
    • など

    Postgresインサートの最適化の詳細については、以下をご覧ください。

    また、システムのパフォーマンスに影響を与える可能性のある他の多くの要因があります。高レベルの紹介については、以下をご覧ください:

    その他のオプション

    • .NETコネクタはPostgresをサポートしていますか Copy コマンド?
      • そうでない場合は、ソースコード をダウンロードできます。 Npgsqlの場合 コネクタを使用して、独自のBulkCopy()を追加します 方法。最初にソースコードのライセンス契約を確認してください。
    • Postgresかどうかを確認します テーブル値パラメータをサポート 。
      • このアプローチでは、テーブルをPostgresに渡すことができます。 データを宛先に直接挿入できる関数。
    • Postgresを購入する 必要な機能を含むベンダーの.NETコネクタ。

    追加の参照



    1. PHP PDO bindParam()およびMySQL BIT

    2. テーブルにauto_incrementを持つ2フィールドの主キーを含めることはできません

    3. Group Byと自己参加を使用して、最小、最大、始値、終値の日次価格再設定セットを返す方法は?

    4. 致命的なエラー:配列コールバックにはインデックス0と1が含まれている必要があります