PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Insira todo o valor do DataTable em massa na tabela postgreSQL

Inserção simples usando parâmetros


Seu projeto precisará referenciar o seguinte assembly:Npgsql . Se esta referência não estiver visível no Visual Studio , então:
  1. navegue até a pasta de instalação do conector
  2. Executar:GACInstall.exe
  3. Reinicie o Visual Studio .

Tabela de amostra

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;

Código de amostra


Certifique-se de usar as seguintes diretivas:
using Npgsql;
using NpgsqlTypes;

Insira o seguinte código-fonte em seu método:
// 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();

Considerações sobre o desempenho


A postagem original não fazia menção aos requisitos de desempenho. Foi solicitado que a solução devesse:
  1. inserir usando uma DataTable
  2. inserir dados sem usar um loop

Se você estiver inserindo quantidades significativas de dados, sugiro que dê uma olhada nas opções de desempenho. O Postgre documentação sugere que você:
  • Desativar confirmação automática
  • Use o COPY comando
  • Remover índices
  • Remover restrições de chave estrangeira
  • etc.

Para obter mais informações sobre como otimizar as inserções do Postgres, consulte:

Além disso, existem muitos outros fatores que podem afetar o desempenho de um sistema. Para uma introdução de alto nível, dê uma olhada em:

Outras opções

  • O conector .NET suporta o Postgres Copy comando?
    • Se não, você pode baixar o código-fonte para o Npgsql conector e adicione seu próprio BulkCopy() método. Certifique-se de revisar primeiro o contrato de licenciamento do código-fonte.
  • Verifique se Postgres suporta Parâmetros de valor de tabela .
    • Esta abordagem permite que você passe uma tabela para um Postgres função que pode inserir os dados diretamente no destino.
  • Compre um Postgres Conector .NET de um fornecedor que inclui o recurso necessário.

Referências adicionais