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:- navegue até a pasta de instalação do conector
- Executar:
GACInstall.exe
- 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:
- inserir usando uma
DataTable
- 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:
- PostgresSql. org:Inserindo dados
- PostgresSql.org :Inserir + Dicas de desempenho
- StackOverflow:como acelerar o desempenho de inserção no PostgreSQL
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:
- Afunilamento de desempenho do ADO.NET SQL Server
- Esta postagem descreve estratégias gerais (ou seja, não SqlServer) para otimizar o desempenho.
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óprioBulkCopy()
método. Certifique-se de revisar primeiro o contrato de licenciamento do código-fonte.
- Se não, você pode baixar o código-fonte
para o
- 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.
- Esta abordagem permite que você passe uma tabela para um
- Compre um Postgres Conector .NET de um fornecedor que inclui o recurso necessário.
Referências adicionais
- Postgres .NET Connector - grátis &código aberto