PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Вмъкнете цялата стойност на масива DataTable в таблицата postgreSQL

Просто вмъкване с помощта на параметри

Вашият проект ще трябва да препраща към следния сбор:Npgsql . Ако тази препратка не се вижда в Visual Studio , след което:

  1. прегледайте инсталационната папка на конектора
  2. Изпълнете:GACInstall.exe
  3. Рестартирайте 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();

Мисли за производителността

В оригиналната публикация не се споменават изисквания за ефективност. Беше поискано решението да:

  1. вмъкнете с помощта на DataTable
  2. вмъкване на данни без използване на цикъл

Ако въвеждате значителни количества данни, бих ви предложил да разгледате опциите си за ефективност. Postgres документацията предполага, че вие:

  • Деактивирайте Autocommit
  • Използвайте COPY команда
  • Премахване на индекси
  • Премахнете ограниченията на външния ключ
  • и т.н.

За повече информация относно оптимизирането на вмъкванията на Postgres, моля, разгледайте:

Освен това има много други фактори, които могат да повлияят на производителността на системата. За въведение на високо ниво вижте:

  • ADO.NET SQL Server Performance bottleneck
    • Тази публикация очертава общи (т.е. различни от SqlServer) стратегии за оптимизиране на производителността.

Други опции

  • .NET конекторът поддържа ли Postgres Copy команда?
    • Ако не, можете да изтеглите изходния код за Npgsql конектор и добавете свой собствен BulkCopy() метод. Не забравяйте първо да прегледате лицензионното споразумение на изходния код.
  • Проверете дали Postgres поддържа параметри на стойността на таблицата .
    • Този подход ви позволява да прехвърлите таблица в Postgres функция, която след това може да вмъкне данните директно в дестинацията.
  • Купете Postgres .NET конектор от доставчик, който включва необходимата функция.

Допълнителни препратки



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Съхранение на криптирани данни в Postgres

  2. Как да индексирам postgres таблица по име, когато името може да бъде на всеки език?

  3. Релси - Използване на съединение с асоциации с потребителски имена

  4. Postgresql. CREATE CAST 'character varying' to 'integer'

  5. Избор на правилния индекс за PostgreSQL заявка