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:
- bläddra till anslutarens installationsmapp
- Kör:
GACInstall.exe
- 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:
- infoga med en
DataTable
- 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å:
- PostgresSql. org:Infogar data
- PostgresSql.org :Infoga + prestandatips
- StackOverflow:Hur man snabbar upp insättningsprestanda i PostgreSQL
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?- Om inte kan du ladda ner källkoden
för
Npgsql
connector och lägg till din egenBulkCopy()
metod. Se till att granska källkodens licensavtal först.
- Om inte kan du ladda ner källkoden
för
- 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.
- Det här tillvägagångssättet låter dig skicka in en tabell till en
- Köp en Postgres .NET-anslutning från en leverantör som innehåller den nödvändiga funktionen.
Ytterligare referenser
- Postgres .NET Connector - gratis &öppen källkod