PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Insérez la valeur entière de DataTable en vrac dans la table postgreSQL

Insertion simple à l'aide de paramètres

Votre projet devra référencer l'assembly suivant :Npgsql . Si cette référence n'est pas visible dans Visual Studio , puis :

  1. naviguez jusqu'au dossier d'installation du connecteur
  2. Exécuter :GACInstall.exe
  3. Redémarrer Visual Studio .

Exemple de tableau

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;

Exemple de code

Assurez-vous d'utiliser les directives suivantes :

using Npgsql;
using NpgsqlTypes;

Entrez le code source suivant dans votre méthode :

// 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();

Réflexions sur les performances

L'affichage original ne faisait aucune mention d'exigences de rendement. Il a été demandé que la solution doit :

  1. insérer à l'aide d'un DataTable
  2. insérer des données sans utiliser de boucle

Si vous insérez des quantités importantes de données, je vous suggère de jeter un œil à vos options de performances. Le Postgres la documentation suggère que vous :

  • Désactiver la validation automatique
  • Utilisez le COPY commande
  • Supprimer les index
  • Supprimer les contraintes de clé étrangère
  • etc.

Pour plus d'informations sur l'optimisation des insertions Postgres, veuillez consulter :

En outre, de nombreux autres facteurs peuvent avoir une incidence sur les performances d'un système. Pour une introduction de haut niveau, jetez un œil à :

Autres options

Références supplémentaires