Jednoduché vložení pomocí parametrů
Váš projekt bude muset odkazovat na následující sestavení:Npgsql
. Pokud tato reference není viditelná ve Visual Studio , pak:
- přejděte do instalační složky konektoru
- Spustit:
GACInstall.exe
- Restartujte Visual Studio .
Ukázková tabulka
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;
Ukázkový kód
Ujistěte se, že používáte následující direktivy:
using Npgsql;
using NpgsqlTypes;
Do své metody zadejte následující zdrojový kód:
// 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();
Myšlenky na výkon
Původní příspěvek nezmiňoval požadavky na výkon. Bylo požadováno, aby řešení:
- vložte pomocí
DataTable
- vkládání dat bez použití smyčky
Pokud vkládáte značné množství dat, navrhuji, abyste se podívali na možnosti výkonu. Postgres dokumentace naznačuje, že:
- Zakažte automatické potvrzení
- Použijte
COPY
příkaz - Odstranění indexů
- Odstraňte omezení cizího klíče
- atd.
Další informace o optimalizaci vložek Postgres naleznete na:
- PostgresSql. org:Vkládání dat
- PostgresSql.org :Vložit + Tipy pro výkon
- StackOverflow:Jak zrychlit výkon vkládání v PostgreSQL
Kromě toho existuje mnoho dalších faktorů, které mohou ovlivnit výkon systému. Pro úvod na vysoké úrovni se podívejte na:
- Úzké místo výkonu ADO.NET SQL Server
- Tento příspěvek nastiňuje obecné (tj. ne-SqlServer) strategie pro optimalizaci výkonu.
Další možnosti
- Podporuje konektor .NET Postgres
Copy
příkaz?- Pokud ne, můžete si stáhnout zdrojový kód
pro
Npgsql
konektor a přidejte vlastníBulkCopy()
metoda. Nejprve si přečtěte licenční smlouvu ke zdrojovému kódu.
- Pokud ne, můžete si stáhnout zdrojový kód
pro
- Zkontrolujte, zda Postgres podporuje Parametry hodnot tabulky .
- Tento přístup vám umožňuje předat tabulku do
Postgres
funkce, která pak může vložit data přímo do cíle.
- Tento přístup vám umožňuje předat tabulku do
- Kupte si Postgres .NET konektor od dodavatele, který obsahuje požadovanou funkci.
Další reference
- Postgres .NET Connector - zdarma &otevřený zdroj