Eenvoudig invoegen met parameters
Uw project moet verwijzen naar de volgende assembly:Npgsql
. Als deze referentie niet zichtbaar is in Visual Studio , dan:
- blader naar de installatiemap van de connector
- Voer uit:
GACInstall.exe
- 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:
- invoegen met behulp van een
DataTable
- 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:
- PostgresSql. org:gegevens invoegen
- PostgresSql.org :Invoegen + Prestatietips
- StackOverflow:hoe de invoegprestaties in PostgreSQL te versnellen
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 eigenBulkCopy()
. toe methode. Lees eerst de licentieovereenkomst van de broncode.
- Zo niet, dan kunt u de broncode
downloaden voor de
- 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.
- Met deze aanpak kun je een tabel doorgeven aan een
- Koop een Postgres .NET-connector van een leverancier die de vereiste functie bevat.
Aanvullende referenties
- Postgres .NET-connector - gratis &open source