sql >> Databasteknik >  >> RDS >> PostgreSQL

Infoga hela värdet för DataTable-bulk i postgreSQL-tabellen

Enkel infogning med parametrar

Ditt projekt kommer att behöva referera till följande sammansättning:Npgsql . Om denna referens inte är synlig i Visual Studio , sedan:

  1. bläddra till anslutarens installationsmapp
  2. Kör:GACInstall.exe
  3. Starta om Visual Studio .

Exempeltabell

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;

Exempelkod

Se till att använda följande direktiv:

using Npgsql;
using NpgsqlTypes;

Ange följande källkod i din metod:

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

Tankar om prestanda

Det ursprungliga inlägget nämnde inget om prestationskrav. Det begärdes att lösningen måste:

  1. infoga med en DataTable
  2. infoga data utan att använda en loop

Om du infogar betydande mängder data, skulle jag föreslå att du tar en titt på dina prestandaalternativ. Postgres dokumentationen föreslår att du:

  • Inaktivera Autocommit
  • Använd COPY kommando
  • Ta bort index
  • Ta bort begränsningar för främmande nyckel
  • osv.

För mer information om att optimera Postgres-inlägg, ta en titt på:

Det finns också många andra faktorer som kan påverka ett systems prestanda. För en introduktion på hög nivå, ta en titt på:

Andra alternativ

  • Stöder .NET-anslutningen Postgres Copy kommando?
  • Kontrollera för att se om Postgres stöder tabellvärdeparametrar .
    • Det här tillvägagångssättet låter dig skicka in en tabell till en Postgres funktion som sedan kan infoga data direkt i destinationen.
  • Köp en Postgres .NET-anslutning från en leverantör som innehåller den nödvändiga funktionen.

Ytterligare referenser



  1. Hur kontrollerar jag om filen är en bild som använder PL/SQL?

  2. Databasschema för ACL

  3. FEL 1045 (28000):Åtkomst nekad för användaren 'root'@'localhost'

  4. Hur TRUNCATE() fungerar i MariaDB