Inserción simple usando parámetros
Su proyecto deberá hacer referencia al siguiente ensamblado:Npgsql
. Si esta referencia no está visible en Visual Studio , entonces:
- vaya a la carpeta de instalación del conector
- Ejecutar:
GACInstall.exe
- Reiniciar Visual Studio .
Tabla de muestra
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 muestra
Asegúrese de utilizar las siguientes directivas:
using Npgsql;
using NpgsqlTypes;
Ingrese el siguiente código fuente en su 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();
Reflexiones sobre el rendimiento
La publicación original no mencionaba los requisitos de rendimiento. Se solicitó que la solución debe:
- insertar usando una
DataTable
- insertar datos sin usar un bucle
Si está insertando cantidades significativas de datos, le sugiero que eche un vistazo a sus opciones de rendimiento. El Postgres la documentación sugiere que usted:
- Desactivar confirmación automática
- Use el
COPY
comando - Eliminar índices
- Eliminar restricciones de clave externa
- etc.
Para obtener más información sobre cómo optimizar las inserciones de Postgres, consulte:
- PostgresSql. org:Inserción de datos
- PostgresSql.org :Insertar + Consejos de rendimiento
- StackOverflow:Cómo acelerar el rendimiento de inserción en PostgreSQL
Además, hay muchos otros factores que pueden afectar el rendimiento de un sistema. Para una introducción de alto nivel, echa un vistazo a:
Otras opciones
- ¿El conector .NET es compatible con Postgres?
Copy
comando?- Si no es así, puede descargar el código fuente
para el
Npgsql
conector y agregue su propioBulkCopy()
método. Asegúrese de revisar primero el acuerdo de licencia del código fuente.
- Si no es así, puede descargar el código fuente
para el
- Compruebe si Postgres admite parámetros de valor de tabla .
- Este enfoque le permite pasar una tabla a un
Postgres
función que luego puede insertar los datos directamente en el destino.
- Este enfoque le permite pasar una tabla a un
- Adquiera un Postgres Conector .NET de un proveedor que incluye la característica requerida.
Referencias adicionales
- Conector Postgres .NET - gratis &código abierto