Просто вмъкване с помощта на параметри
Вашият проект ще трябва да препраща към следния сбор:Npgsql
. Ако тази препратка не се вижда в Visual Studio , след което:
- прегледайте инсталационната папка на конектора
- Изпълнете:
GACInstall.exe
- Рестартирайте Visual Studio .
Примерна таблица
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;
Примерен код
Не забравяйте да използвате следните директиви:
using Npgsql;
using NpgsqlTypes;
Въведете следния изходен код във вашия метод:
// 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();
Мисли за производителността
В оригиналната публикация не се споменават изисквания за ефективност. Беше поискано решението да:
- вмъкнете с помощта на
DataTable
- вмъкване на данни без използване на цикъл
Ако въвеждате значителни количества данни, бих ви предложил да разгледате опциите си за ефективност. Postgres документацията предполага, че вие:
- Деактивирайте Autocommit
- Използвайте
COPY
команда - Премахване на индекси
- Премахнете ограниченията на външния ключ
- и т.н.
За повече информация относно оптимизирането на вмъкванията на Postgres, моля, разгледайте:
- PostgresSql. org:Вмъкване на данни
- PostgresSql.org :Вмъкване + Съвети за ефективност
- StackOverflow:Как да ускорите производителността на вмъкване в PostgreSQL
Освен това има много други фактори, които могат да повлияят на производителността на системата. За въведение на високо ниво вижте:
- ADO.NET SQL Server Performance bottleneck
- Тази публикация очертава общи (т.е. различни от SqlServer) стратегии за оптимизиране на производителността.
Други опции
- .NET конекторът поддържа ли Postgres
Copy
команда?- Ако не, можете да изтеглите изходния код
за
Npgsql
конектор и добавете свой собственBulkCopy()
метод. Не забравяйте първо да прегледате лицензионното споразумение на изходния код.
- Ако не, можете да изтеглите изходния код
за
- Проверете дали Postgres поддържа параметри на стойността на таблицата .
- Този подход ви позволява да прехвърлите таблица в
Postgres
функция, която след това може да вмъкне данните директно в дестинацията.
- Този подход ви позволява да прехвърлите таблица в
- Купете Postgres .NET конектор от доставчик, който включва необходимата функция.
Допълнителни препратки
- Postgres .NET Connector - безплатно &отворен код