sql >> Database >  >> RDS >> PostgreSQL

Voeg de volledige waarde van DataTable-bulk in de postgreSQL-tabel in

Eenvoudig invoegen met parameters

Uw project moet verwijzen naar de volgende assembly:Npgsql . Als deze referentie niet zichtbaar is in Visual Studio , dan:

  1. blader naar de installatiemap van de connector
  2. Voer uit:GACInstall.exe
  3. Herstart Visual Studio .

Voorbeeldtabel

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;

Voorbeeldcode

Zorg ervoor dat u de volgende richtlijnen gebruikt:

using Npgsql;
using NpgsqlTypes;

Voer de volgende broncode in uw methode in:

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

Gedachten over prestaties

De oorspronkelijke posting maakte geen melding van prestatie-eisen. Er werd gevraagd dat de oplossing:

  1. invoegen met behulp van een DataTable
  2. gegevens invoegen zonder een lus te gebruiken

Als u aanzienlijke hoeveelheden gegevens invoert, raad ik u aan uw prestatie-opties te bekijken. De Postgres documentatie suggereert dat u:

  • Automatisch vastleggen uitschakelen
  • Gebruik de COPY commando
  • Indexen verwijderen
  • Restricties voor externe sleutels verwijderen
  • enz.

Kijk voor meer informatie over het optimaliseren van Postgres-inserts op:

Er zijn ook veel andere factoren die van invloed kunnen zijn op de prestaties van een systeem. Kijk voor een introductie op hoog niveau op:

Andere opties

  • Ondersteunt de .NET-connector de Postgres Copy commando?
    • Zo niet, dan kunt u de broncode downloaden voor de Npgsql connector en voeg uw eigen BulkCopy() . toe methode. Lees eerst de licentieovereenkomst van de broncode.
  • Controleer of Postgres ondersteunt Tabelwaardeparameters .
    • Met deze aanpak kun je een tabel doorgeven aan een Postgres functie die de gegevens vervolgens rechtstreeks in de bestemming kan invoegen.
  • Koop een Postgres .NET-connector van een leverancier die de vereiste functie bevat.

Aanvullende referenties



  1. Schrijf PHP PDO-query's als `dbName`.`tableName` in tegenstelling tot `tableName` - waarom?

  2. Automatisch importeren van gegevens van mysql naar solr

  3. Waarom voorkomt deze regel niet dat dubbele sleutels worden geschonden?

  4. Krijg laatste insert-ID na een voorbereide insert met PDO