sql >> Database teknologi >  >> RDS >> PostgreSQL

Indsæt hele værdien af ​​DataTable-bulk i postgreSQL-tabellen

Simpel indsættelse ved hjælp af parametre

Dit projekt skal referere til følgende samling:Npgsql . Hvis denne reference ikke er synlig i Visual Studio , så:

  1. Gennemse til stikkets installationsmappe
  2. Udfør:GACInstall.exe
  3. Genstart Visual Studio .

Eksempeltabel

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;

Eksempelkode

Sørg for at bruge følgende retningslinjer:

using Npgsql;
using NpgsqlTypes;

Indtast følgende kildekode i din metode:

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

Tanker om ydeevne

Det oprindelige opslag nævnte ingen præstationskrav. Der blev bedt om, at løsningen skulle:

  1. indsæt ved hjælp af en DataTable
  2. indsæt data uden at bruge en loop

Hvis du indsætter betydelige mængder data, så vil jeg foreslå, at du tager et kig på dine muligheder for ydeevne. Postgres dokumentation foreslår, at du:

  • Deaktiver Autocommit
  • Brug COPY kommando
  • Fjern indekser
  • Fjern begrænsninger for fremmednøgle
  • osv.

For mere information om optimering af Postgres-indlæg, tag venligst et kig på:

Der er også en masse andre faktorer, der kan påvirke et systems ydeevne. For en introduktion på højt niveau, tag et kig på:

Andre muligheder

  • Understøtter .NET-stikket Postgres Copy kommando?
    • Hvis ikke, kan du downloade kildekoden for Npgsql connector og tilføj din egen BulkCopy() metode. Sørg for at gennemgå kildekodens licensaftale først.
  • Tjek for at se, om Postgres understøtter Tabelværdiparametre .
    • Denne tilgang giver dig mulighed for at overføre en tabel til en Postgres funktion, som så kan indsætte dataene direkte i destinationen.
  • Køb en Postgres .NET-stik fra en leverandør, som indeholder den nødvendige funktion.

Yderligere referencer



  1. Opret en ny database med MySQL Workbench

  2. Mellem udsagn mangler indekser i visse tilfælde

  3. Docker-compose miljøvariabler

  4. spring tabeller over, når du kører Doctrine convert-mapping