Einfaches Einfügen mit Parametern
Ihr Projekt muss auf die folgende Assembly verweisen:Npgsql
. Wenn diese Referenz in Visual Studio nicht sichtbar ist , dann:
- navigieren Sie zum Installationsordner des Connectors
- Ausführen:
GACInstall.exe
- Starten Sie Visual Studio neu .
Beispieltabelle
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;
Beispielcode
Achten Sie darauf, die folgenden Anweisungen zu verwenden:
using Npgsql;
using NpgsqlTypes;
Geben Sie den folgenden Quellcode in Ihre Methode ein:
// 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();
Gedanken zur Leistung
Der ursprüngliche Beitrag erwähnte keine Leistungsanforderungen. Es wurde gefordert, dass die Lösung:
- Einfügen mit einer
DataTable
- Daten ohne Schleife einfügen
Wenn Sie erhebliche Datenmengen einfügen, würde ich vorschlagen, dass Sie sich Ihre Leistungsoptionen ansehen. Das Postgres Dokumentation schlägt vor, dass Sie:
- Autocommit deaktivieren
- Verwenden Sie den
COPY
Befehl - Indizes entfernen
- Fremdschlüsselbeschränkungen entfernen
- usw.
Weitere Informationen zur Optimierung von Postgres-Einfügungen finden Sie unter:
- PostgresSql. org:Daten einfügen
- PostgresSql.org :Einfügen + Leistungstipps
- StackOverflow:So beschleunigen Sie die Einfügeleistung in PostgreSQL
Außerdem gibt es viele andere Faktoren, die sich auf die Leistung eines Systems auswirken können. Eine allgemeine Einführung finden Sie unter:
- ADO.NET SQL Server-Leistungsengpass
- Dieser Beitrag skizziert allgemeine (d. h. Nicht-SqlServer) Strategien zur Leistungsoptimierung.
Andere Optionen
- Unterstützt der .NET-Connector Postgres
Copy
Befehl?- Falls nicht, können Sie den Quellcode
herunterladen für
Npgsql
Connector und fügen Sie Ihr eigenesBulkCopy()
hinzu Methode. Lesen Sie zuerst die Lizenzvereinbarung des Quellcodes.
- Falls nicht, können Sie den Quellcode
herunterladen für
- Überprüfen Sie, ob Postgres unterstützt Tabellenwertparameter .
- Dieser Ansatz ermöglicht es Ihnen, eine Tabelle in ein
Postgres
zu übergeben Funktion, die die Daten dann direkt in das Ziel einfügen kann.
- Dieser Ansatz ermöglicht es Ihnen, eine Tabelle in ein
- Kaufen Sie ein Postgres .NET-Connector eines Anbieters, der die erforderliche Funktion enthält.
Zusätzliche Referenzen
- Postgres .NET Connector - kostenlos &Open Source