当前位置: 首页 > 编程语言 > C#

将DataTablebulk的整个值插入postgreSQL表分享

时间:2023-04-10 14:20:42 C#

将DataTablebulk的整个值插入postgreSQL表在SQL中,我们执行这样的操作来批量插入数据表SqlBulkCopycopy=newSqlBulkCopy(sqlCon);copy.DestinationTableName=strDestinationTable;复制.WriteToServer(dtFrom);Blockquote但是如何在PostgreSQL中执行此操作带参数的简单插入您的项目需要引用以下程序集:Npgsql。如果此引用在VisualStudio中不可见,则:浏览到连接器的安装文件夹执行:GACInstall.exe重新启动VisualStudio。CREATETABLE"OrderHistory"("OrderId"beginNOTNULL,"TotalAmount"begin,CONSTRAINT"OrderIdPk"PRIMARYKEY("OrderId"))WITH(OIDS=FALSE);将表“OrderHistory”所有者更改为postgres;GRANTALLONTABLE"OrderHistory"TOpostgres;将ALLONTABLE“OrderHistory”公开;ALTERTABLE"OrderHistory"ALTERCOLUMN"OrderId"SET(n_distinct=1);GRANTSELECT("OrderId"),UPDATE("OrderId"),INSERT("OrderId"),REFERENCES("OrderId")ON"OrderHistory"TOpublic;GRANTSELECT("TotalAmount"),UPDATE("TotalAmount"),INSERT("TotalAmount"),REFERENCE("TotalAmount")ON"OrderHistory"TOpublic;配置默认设置:使用Npgsql;使用NpgsqlTypes;OrderHistory表需要以下步骤://确保用户具有OrderHistory表的INSERT权限。NpgsqlConnectionconnection=newNpgsqlConnection("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;用户名=test");connection.Open();DataSetdataSet=newDataSet();NpgsqlDataAdapterdataAdapter=newNpgsqlDataAdapter("select*fromOrderHistorywhereOrderId=-1",connection);dataAdapter.InsertCommand=newNpgsqlCommand("insertintoOrderHistory(OrderId,TotalAmount)"+"值(:a,:b)",connection);dataAdapter.InsertCommand.Parameters.Add(newNpgsqlParameter("a",NpgsqlDbType.Bigint));dataAdapter.InsertCommand.Parameters.Add(新的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);DataTablenewOrders=dataSet.Tables[0];DataRownewOrder=newOrders.NewRow();newOrder["OrderId"]=20;newOrder["TotalAmount"]=20.0;newOrders.Rows.Add(n订单);数据集ds2=dataSet.GetChanges();dataAdapter.Update(ds2);dataSet.Merge(ds2);数据集.AcceptChanges();connection.Close();关于性能的思考原始帖子没有提到性能要求解决方案必须:使用DataTable插入数据而不使用循环如果您要插入大量数据,那么我建议您查看您的性能选项。Postgres文档建议您:有关优化Postgres插入的更多信息,请查看:此外,还有许多其他因素会影响系统的性能。有关高级介绍,请参阅:AlternativesCheckifPostgressupportstable-valuedparameters。从包含所需功能的供应商处购买Postgres.NET连接器。其他参考我前段时间遇到了同样的问题。到目前为止,似乎还没有一个“随时可用”的解决方案。我读过这篇文章并构建了一个类似的解决方案,我今天仍在使用。它基于文本查询,从STDIN读取文件。它使用ADO.NETPostgre数据提供程序Npgsql。您可以从DataTable创建一个大字符串(或临时文件、内存使用原因)并将其用作带有COPY命令的文本查询。在我们的例子中,它比插入一行要快得多。也许这不是一个完整的解决方案,但可能是一个好的开始和我所知道的一切。?我还发现没有“准备好使用”的解决方案。也许你可以查看我的其他答案,我在其中描述了我为这个问题创建的一个小助手,使用另一个助手非常简单:https://stackoverflow.com/a/46063313/6654362我认为这是目前最好的解决方案。万一帖子死了,我从链接发布了解决方案。编辑:我最近遇到了类似的问题,但我们使用的是Postgresql。我想使用efficientbulkinsert结果发现很难。我没有在这个数据库上找到任何合适的免费图书馆。我只找到了这个助手:https://bytefish.de/blog/postgresql_bulk_insert/,它也在Nuget上。我写了一个小的投影器,它以实体框架的方式自动投影属性:);varproperties=typeof(T).GetProperties();foreach(varpropinproperties){vartype=prop.PropertyType;如果(Attribute.IsDefined(prop,typeof(KeyAttribute))||Attribute.IsDefined(prop,typeof(ForeignKeyAttribute)))继续;switch(type){caseTypeintType当intType==typeof(int)||intType==typeof(int?):{helper=helper.MapInteger("""+prop.Name+""",x=>(int?)typeof(T).GetProperty(prop.Name).GetValue(x,无效的));休息;}caseTypestringTypewhenstringType==typeof(string):{helper=helper.MapText("""+prop.Name+""",x=>(string)typeof(T).GetProperty(prop.Name).获取值(x,空));休息;}case输入dateTypewhendateType==typeof(DateTime)||dateType==typeof(DateTime?):{helper=helper.MapTimeStamp("""+prop.Name+""",x=>(DateTime?)typeof(T).GetProperty(prop.Name).GetValue(x,null));休息;}caseTypedecimalTypewhendecimalType==typeof(decimal)||decimalType==typeof(decimal?):{helper=helper.MapMoney("""+prop.Name+""",x=>(decimal?)typeof(T).GetProperty(prop.Name).GetValue(x,无效的));休息;}case类型doubleTypewhendoubleType==typeof(double)||doubleType==typeof(double?):{helper=helper.MapDouble("""+prop.Name+""",x=>(double?)typeof(T).GetProperty(prop.Name).GetValue(x,无效的));休息;}caseTypefloatTypewhenfloatType==typeof(float)||floatType==typeof(float?):{helper=helper.MapReal("""+prop.Name+""",x=>(float?)typeof(T).GetProperty(prop.Name).GetValue(x,无效的));休息;}case类型guidTypewhenguidType==typeof(Guid):{helper=helper.MapUUID("""+prop.Name+""",x=>(Guid)typeof(T).GetProperty(prop.Name).获取值(x,空));休息;}}}返回助手;我下面的方式使用它(我有一个名为Undertaking的实体):varundertakingHelper=BulkMapper.CreateHelper("dbo",nameof(Model.Undertaking));undergressHelper.SaveAll(transaction.UnderlyingTransaction.ConnectionasNpgsql.NpgsqlConnection,underringsToAdd));在上下文中检索到的用于完成undertakingsToAdd的普通连接是可枚举的普通实体记录,我想将其插入到数据库中。经过数小时的研究和尝试,我得到了这个解决方案,您可以期待它会更快,最终易于使用且免费!我真的推荐你使用这个解决方案,不仅是因为上面提到的原因,而且因为它是唯一一个我对Postgresql本身没有问题的解决方案,许多其他解决方案都可以完美运行,例如使用SqlServer。您真的要使用DataTable吗?如果您可以使用EFCodeFirst,那么您可以使用本文中的代码。这篇文章的思路是,以NpgsqlCOPY为基础+从DB本身获取元数据,与模型类中的元数据合并,动态生成写入数据的代码。使用方法如下:以上为C#学习教程:将DataTable批量插入整个值到postgreSQL表中,分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varuploader=newNpgsqlBulkUploader(context);变种数据=GetALotOfData();上传者。插入(数据);//或uploader.Update(data);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: