c# – 将DataTable批量的整个值插入到postgreSQL表中

在SQL中,我们做了类似这样的批量插入到datatable

SqlBulkCopy copy = new SqlBulkCopy(sqlCon);
copy.DestinationTableName = strDestinationTable;            
copy.WriteToServer(dtFrom);

Blockquote

但是在PostgreSQL中怎么做这个操作

使用参数简单插入

您的项目将需要参考以下程序集:Npgsql。如果此引用在Visual Studio中不可见,则:

>浏览到连接器的安装文件夹
>执行:GACInstall.exe
>重新启动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();

对性能的思考

原始发布没有提及性能要求。有人要求解决方案必须:

>使用DataTable插入
>插入数据而不使用循环

如果你插入大量的数据,那么我建议你看一下你的性能选项。 Postgres文档建议您:

>禁用自动提交
>使用COPY命令
>删除索引
>删除外键限制
>等

有关优化Postgres插入的更多信息,请查看:

> PostgresSql.org: Inserting Data
> PostgresSql.org: Insert + Performance Tips
> StackOverflow: How to speed up insertion performance in PostgreSQL

此外,还有很多其他因素可能会影响系统的性能。对于高层次的介绍,请看:

> ADO.NET SQL Server Performance bottleneck

>这个发布概述了一般(即非SqlServer)策略来优化性能。

其他选项

> .NET连接器是否支持Postgres Copy命令?

>如果没有,您可以下载Npgsql连接器的source code并添加您自己的BulkCopy()方法。请务必先查看源代码的许可协议。

>检查Postgres是否支持表值参数。

>这种方法允许您将表格传入Postgres函数,然后可以将数据直接插入到目标中。

>从包含所需功能的供应商处购买一个Postgres .NET连接器。

附加参考

> Postgres .NET Connector – free&开源

翻译自:https://stackoverflow.com/questions/30320418/insert-the-whole-value-of-datatable-bulk-into-postgresql-table

转载注明原文:c# – 将DataTable批量的整个值插入到postgreSQL表中