Inserimento semplice utilizzando i parametri
Il tuo progetto dovrà fare riferimento al seguente assembly:Npgsql
. Se questo riferimento non è visibile in Visual Studio , quindi:
- naviga alla cartella di installazione del connettore
- Esegui:
GACInstall.exe
- Riavvia Visual Studio .
Tabella di esempio
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;
Codice campione
Assicurati di utilizzare le seguenti direttive:
using Npgsql;
using NpgsqlTypes;
Inserisci il seguente codice sorgente nel tuo metodo:
// 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();
Riflessione sulle prestazioni
Il messaggio originale non faceva menzione di requisiti di prestazione. È stato richiesto che la soluzione debba:
- inserisci usando una
DataTable
- inserisci i dati senza utilizzare un ciclo
Se stai inserendo quantità significative di dati, ti suggerirei di dare un'occhiata alle tue opzioni di prestazioni. Il Postgres documentazione suggerisce di:
- Disabilita Autocommit
- Usa il
COPY
comando - Rimuovi indici
- Rimuovi i vincoli di chiave esterna
- ecc.
Per ulteriori informazioni sull'ottimizzazione degli inserti Postgres, dai un'occhiata a:
- PostgresSql. org:Inserimento di dati
- PostgresSql.org :Inserisci + Suggerimenti sul rendimento
- StackOverflow:come velocizzare le prestazioni di inserimento in PostgreSQL
Inoltre, ci sono molti altri fattori che possono influire sulle prestazioni di un sistema. Per un'introduzione di alto livello, dai un'occhiata a:
- Collo di bottiglia delle prestazioni di ADO.NET SQL Server
- Questo post delinea le strategie generali (cioè non-SqlServer) per ottimizzare le prestazioni.
Altre opzioni
- Il connettore .NET supporta Postgres
Copy
comando?- In caso contrario, puoi scaricare il codice sorgente
per il
Npgsql
connettore e aggiungi il tuoBulkCopy()
metodo. Assicurati di rivedere prima il contratto di licenza del codice sorgente.
- In caso contrario, puoi scaricare il codice sorgente
per il
- Controlla se Postgres supporta Parametri valore tabella .
- Questo approccio ti consente di passare una tabella in un
Postgres
funzione che può quindi inserire i dati direttamente nella destinazione.
- Questo approccio ti consente di passare una tabella in un
- Acquista un Postgres Connettore .NET di un fornitore che include la funzionalità richiesta.
Riferimenti aggiuntivi
- Postgres .NET Connector - gratuito &open source