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å:
- Gennemse til stikkets installationsmappe
- Udfør:
GACInstall.exe
- 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:
- indsæt ved hjælp af en
DataTable
- 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å:
- PostgresSql. org:Indsættelse af data
- PostgresSql.org :Indsæt + tip til ydeevne
- StackOverflow:Sådan fremskyndes indsættelsesydelsen i PostgreSQL
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å:
- ADO.NET SQL Server Performance flaskehals
- Dette opslag skitserer generelle (dvs. ikke-SqlServer) strategier til optimering af ydeevnen.
Andre muligheder
- Understøtter .NET-stikket Postgres
Copy
kommando?- Hvis ikke, kan du downloade kildekoden
for
Npgsql
connector og tilføj din egenBulkCopy()
metode. Sørg for at gennemgå kildekodens licensaftale først.
- Hvis ikke, kan du downloade kildekoden
for
- 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.
- Denne tilgang giver dig mulighed for at overføre en tabel til en
- Køb en Postgres .NET-stik fra en leverandør, som indeholder den nødvendige funktion.
Yderligere referencer
- Postgres .NET Connector - gratis &open source