Npgsql使用入门(三)【批量导入数据】

c#+npgsql采坑记录 c#+npgsql采坑记录 做数据库作业时踩了些坑,做个记录 1.pgsql的主键int的模糊查询 pgsql中以int作为主键,比如student以sid作为主键,当sid为int时,模糊查询会使索引失效。而mysql没有这个问题。所以主键类型的设定要慎重 详情看 2.npgsqlcommand的insert 报错主键重复程序崩溃,但实际插入成功了,把字符串换成删除时没有问题;把insert语句放在pgsql里执行也没问题,暂时还没找到原因,可能是.net的问题 可能的解决方案 ... 阅读详情

什么是成功的秘决:艰苦劳动、正确方法,少说空话。——爱因斯坦


Program.cs代码:

 class Program
    {
        static void Main(string[] args)
        {
            var test = new PgBulkCopyHelper<SingleBuilding>("bld_amap_gzmain");

            foreach (string pName in test.PropNames)
            {
                Console.WriteLine("name: {0},\t\ttype: {1}", pName, test.PropInfo[pName]);
            }

            //-----------------------------------------------------------------------------------------------
            //定义每次插入的最大数量限制
            int maxNum = 1; //100000;
            //初始化对应的数据表
            DataTable dataTable = test.InitDataTable();
            string connectionString = "Host=localhost;Username=king;Password=wu12345;Database=dellstore";
            List<List<SingleBuilding>> bldsList = new List<List<SingleBuilding>>();

            NpgsqlPolygon plg1 = new NpgsqlPolygon(10);
            plg1.Add(new NpgsqlPoint(0.0, 0.0));
            plg1.Add(new NpgsqlPoint(6.0, -1.0));
            plg1.Add(new NpgsqlPoint(5.0, 3.0));
            plg1.Add(new NpgsqlPoint(1.0, 2.0));




            NpgsqlPolygon plg2 = new NpgsqlPolygon(10);
            plg2.Add(new NpgsqlPoint(100.0, 10.0));
            plg2.Add(new NpgsqlPoint(40.0, 180.0));
            plg2.Add(new NpgsqlPoint(190.0, 60.0));
            plg2.Add(new NpgsqlPoint(10.0, 60.0));
            plg2.Add(new NpgsqlPoint(160.0, 180.0));


            List<SingleBuilding> sblist1 = new List<SingleBuilding>(){
              new SingleBuilding(){id=System.Guid.NewGuid(),
                                   tile_x=1,         
                                   tile_y=2,         
                                   bps_gc=plg1,
                                   bps_llc=plg2,

                                   cp_gc=new NpgsqlPoint(0,0),   
                                   cp_llc=new NpgsqlPoint(100,10),  
                                   name="测试文本1",
                                   bld_floor=111,     
                                   height=22           

              },
              new SingleBuilding(){id=System.Guid.NewGuid(),
                                   tile_x=1,         
                                   tile_y=2,         
                                   bps_gc=plg1,
                                   bps_llc=plg2,

                                   cp_gc=new NpgsqlPoint(0,0),   
                                   cp_llc=new NpgsqlPoint(100,10),  
                                   name="测试文本2",
                                   bld_floor=222,     
                                   height=444     
              }
            };

            bldsList.Add(sblist1);

            using (var conn = new NpgsqlConnection(connectionString))
            {
                conn.Open();

                foreach (List<SingleBuilding> blds in bldsList)
                {
                    if (blds != null && blds.Count > 0)
                    {
                        //填充数据
                        test.FillDataTable(blds, dataTable);
                    }

                    //判断 dataTable 里面的数据量是否已经超过规定最大行数 maxNum
                    if (dataTable.Rows.Count>maxNum)
                    {
                        //如果是,则将 dataTable 里面的数据插入到数据库中
                        test.BulkInsert(conn, dataTable);
                        //清空 dataTable 中的现有数据
                        dataTable.Clear();
                    }
                }
            }
        }
    }

    public class SingleBuilding
    {
        //创建数据表的SQL语句如下:
        /*
        CREATE TABLE bld_amap_gzmain (
            id uuid PRIMARY KEY NOT NULL,
            tile_x integer,             --x index of the map tile where the building is located
            tile_y integer,             --y index of the map tile where the building is located
            bps_gc polygon NOT NULL,    --the points of the bottom outline of the building, geodetic coordinates
            bps_llc polygon NOT NULL,   --the points of the bottom outline of the building, Latitude and longitude coordinates
            cp_gc point NOT NULL,       --the center point of the building, geodetic coordinates
            cp_llc point NOT NULL,      --the center point of the building, Latitude and longitude coordinates
            name text,
            bld_floor smallint,         --the number of floors of the building
            height real                 --the height of building
        );
        */

        public Guid id { get; set; }
        public int? tile_x { get; set; }
        public int? tile_y { get; set; }
        public NpgsqlPolygon bps_gc { get; set; }
        public NpgsqlPolygon bps_llc { get; set; }
        public NpgsqlPoint cp_gc { get; set; }
        public NpgsqlPoint cp_llc { get; set; }
        public string name { get; set; }
        public short? bld_floor { get; set; }
        public float? height { get; set; }
    }

PgBulkCopyHelper.cs代码:

using Npgsql;
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Reflection;

namespace PgBulkCopyHelper
{
    /// <summary>
    /// 用以快速将大批量数据插入到postgresql中
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public class PgBulkCopyHelper<TEntity>
    {
        /// <summary>
        /// TEntity的属性信息
        /// Dictionary(string "property_name", Type property_type)
        /// </summary>
        public Dictionary<string, Type> PropInfo { get; set; }
        /// <summary>
        /// TEntity的属性名称列表
        /// </summary>
        public List<string> PropNames { get; set; }
        /// <summary>
        /// 数据表全名:schema.tableName or tableName
        /// </summary>
        public string FullTableName { get; set; }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="schema">数据表的schema,一般为public</param>
        /// <param name="tableName">数据表的名称</param>
        public PgBulkCopyHelper(string schema, string tableName)
        {
            PropNames = new List<string>();
            PropInfo = new Dictionary<string, Type>();
            PropertyInfo[] typeArgs = GetPropertyFromTEntity();
            foreach (PropertyInfo tParam in typeArgs)
            {
                PropNames.Add(tParam.Name);
                PropInfo[tParam.Name] = tParam.PropertyType;
            }

            if (!string.IsNullOrWhiteSpace(tableName))
            {
                if (string.IsNullOrWhiteSpace(schema))
                {
                    FullTableName = tableName;
                }
                else
                    FullTableName = string.Format("{0}.{1}", schema, tableName);
            }
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="tableName">数据表的名称</param>
        public PgBulkCopyHelper(string tableName)
            :this(null, tableName)
        { }

        /// <summary>
        /// 获取TEntity的属性信息
        /// </summary>
        /// <returns>TEntity的属性信息的列表</returns>
        private PropertyInfo[] GetPropertyFromTEntity()
        {
            Type t = typeof(TEntity);
            PropertyInfo[] typeArgs = t.GetProperties();
            return typeArgs;
        }

        /// <summary>
        /// 根据TEntity的属性信息构造对应数据表
        /// </summary>
        /// <returns>只有字段信息的数据表</returns>
        public DataTable InitDataTable()
        {
            DataTable dataTable = new DataTable();

            foreach(PropertyInfo tParam in GetPropertyFromTEntity())
            {
                Type propType = tParam.PropertyType;
                //由于 DataSet 不支持 System.Nullable<> 类型,因此要先做判断
                if ((propType.IsGenericType) && (propType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    propType = propType.GetGenericArguments()[0];
                dataTable.Columns.Add(tParam.Name, propType);
            }

            return dataTable;
        }

        /// <summary>
        /// 根据TEntity可枚举列表填充给定的数据表
        /// </summary>
        /// <param name="entities">TEntity类型的可枚举列表</param>
        /// <param name="dataTable">数据表</param>
        public void FillDataTable(IEnumerable<TEntity> entities, DataTable dataTable)
        {
            if (entities != null && entities.Count() > 0)
            {
                foreach (TEntity entity in entities)
                {
                    FillDataTable(entity, dataTable);
                }
            }
        }

        /// <summary>
        /// 在DataTable中插入单条数据
        /// </summary>
        /// <param name="entity">具体数据</param>
        /// <param name="dataTable">数据表</param>
        public void FillDataTable(TEntity entity, DataTable dataTable)
        {
            var dataRow = dataTable.NewRow();
            int colNum = dataTable.Columns.Count;
            PropertyInfo[] typeArgs = GetPropertyFromTEntity();
            for (int i = 0; i < colNum; i++)
            {
                dataRow[i] = typeArgs[i].GetValue(entity);
            }
            dataTable.Rows.Add(dataRow);
        }

        /// <summary>
        /// 通过PostgreSQL连接把dataTable中的数据整块填充到数据库对应的数据表中
        /// 注意,该函数不负责NpgsqlConnection的创建、打开以及关闭
        /// </summary>
        /// <param name="conn">PostgreSQL连接</param>
        /// <param name="dataTable">数据表</param>
        public void BulkInsert(NpgsqlConnection conn, DataTable dataTable)
        {
            var commandFormat = string.Format(CultureInfo.InvariantCulture, "COPY {0} FROM STDIN BINARY", FullTableName);
            using (var writer = conn.BeginBinaryImport(commandFormat))
            {
                foreach (DataRow item in dataTable.Rows)
                    writer.WriteRow(item.ItemArray);
            }
        }
    }
}

运行结果如图:

这里写图片描述


这里写图片描述

掌握C#与PostgreSQL交互:Npgsql库的使用指南 Npgsql是一个开源的.NET数据提供程序,它允许.NET应用程序与PostgreSQL数据库进行交互。作为ADO.NET的提供者,Npgsql实现了完整的数据库连接管理,包括执行SQL语句、管理事务、读取和写入数据等核心功能。应用场景十分广泛,它被用于需要稳定且高效数据库交互的各种应用程序,尤其是在那些需要利用PostgreSQL的强大特性如复杂的查询操作、事务处理、存储过程等方面的场景。例如,Web应用程序、企业级应用程序、数据分析和报告工具等。 阅读详情

相关推荐

PostgreSQLCopyHelper:围绕Npgsql的简单包装器,用于使用PostgreSQL COPY函数

PostgreSQLCopyHelper PostgreSQLCopyHelper是一个用于向PostgreSQL数据库高效批量插入的库。 它将Npgsql的COPY方法包装在一个不错的Fluent API之后。 正在安装 要安装PostgreSQLCopyHelper,请在程序包管理器控制台中运行以下命令: PM> Install-Package PostgreSQLCopyHelper 基本用法 假设我们有要将数据复制到的下表: CREATE TABLE sample .unit_test ( col_smallint smallint , col_integer integer

C#使用Npgsql或SqlClient连接数据库

在C#使用Npgsql和SqlClient连接SQLserver、pgsql

二十多岁的你迷茫又着急,想要车子,想要房子,想要享受旅行,你那么浮躁,拿什么看透人生! 4552

Npgsql.Bulk:使用Entity Framework + Npgsql轻松执行COPY(批量插入和更新)操作的助手

Npgsql.Bulk 使用Entity Framework + Npgsql轻松执行COPY(批量插入和更新)操作的助手。 支持.Net 4.5,Standard 2.0。 var uploader = new NpgsqlBulkUploader ( context ); var data = GetALotOfData (); // To create a lot of objects uploader . Insert ( data ); // To update a lot of objects uploader . Update ( data ); 对于.Net 4.5,BulkSelect操作得以实现,它模拟了将内存中的表联接到DB表。 这是示例: // We need DbContext first var context = GetContext ();

【亲测免费】 Npgsql - PostgreSQL 数据库连接器

是一个开源的 .NET 数据提供程序,用于与 PostgreSQL 数据库进行交互。Npgsql 支持各种 .NET 框架(包括 .NET Core 和 Mono)和语言,并提供了强大的功能和优化。 ## PostgreSQL 数据库连接器 PostgreSQL 是一种功能强大、开放源代码的关系型数据库管理系统。Npgsql 提供了可靠且高效的连接器,使 .NET 开发人员能够利用 Postg...

gitblog_00013的博客 1535

Windows下快速搭建MSYS2开发环境(含GCC与MinGW配置)

本文详细介绍了在Windows系统下快速搭建MSYS2开发环境的完整流程。通过使用pacman包管理器,可以便捷地安装GCC编译器与MinGW-w64工具链,并配置系统环境变量。文章还涵盖了从基础安装、系统更新到编译开源项目的实战指南,帮助开发者高效构建原生Windows程序,显著提升C/C++开发效率。

weixin_29213827的博客 539

《科研伦理与学术规范》 全部 习题_答案 2020年秋

科研伦理与学术规范 答案 文章目录科研伦理与学术规范 答案1. 第一章课后习题(必做) 答案1.1 第一章Demo2. 第二章课后习题(必做) 答案3. 第三章课后习题(必做) 答案4. 第四章课后习题(必做) 答案5. 第五章课后习题(必做) 答案6. 第六章课后习题(必做) 答案 # 每行5题 #写于2020.11.17 侵删 1. 第一章课后习题(必做) 答案 ABC, A, B ,D ,ABCD ABC, D, A, BCD, C D, D, 1.1 第一章Demo

羊老羊 25万+

C#连接数据库PostSQL-NpgSQL

C#使用NpgSQL连接数据库源码,连接本地PostSQL数据库,完成数据库连接、访问、增删改查等基本操作。相关方法封装使用

qq_38560619的博客 8325

Emuelec系统安装全流程:超详细版指南(从零开始)

手把手带你完成emuelec系统的完整安装,从基础准备到系统配置一步不落,适合新手入门。深入解析emuelec在各类设备上的部署技巧,让复古游戏体验更流畅。

weixin_42594419的博客 1973

Npgsql实现Postgresql数据库表的批量导入及导出(Bulk Copy)

我们知道在ADO.NET中有“System.Data.SqlClient.SqlBulkCopy类”专门针对SQLServer的批导入表数据操作(Bulk Copy),而针对Postgresql的Npgsql并无相应的类,Npgsql实现BulkCopy是通过Copy指令实现的,详细可以参考Npgsql官网对BulkCopy的说明https://www.npgsql.org/doc/copy.html (如果想更多了解关于Copy指令的语法可以阅读https://www.postgresql.org...

carcarrot的博客 5021

YOLO详解

本文参考知乎 https://zhuanlan.zhihu.com/p/25236464 1. YOLO的创新点 YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。 从网络设计上,YOLO与two steps的目标检测方法如RCNN、Fast RCNN和Faster RCNN的区别如下: YOLO训练和检测均是在一个单独网...

UnknownPlayer的博客 9959

手把手教你用Foobar2000播放DSD音频(含DOP设置与SPDIF输出教程)

本文详细指导如何在Foobar2000中播放DSD音频,重点解析了DOP协议的原理与设置方法。通过安装SACD插件、配置输出设备及启用DOP模式,实现DSD音频的原生比特流输出,并特别讲解了如何通过SPDIF接口传输DSD信号,帮助发烧友充分释放高清音频设备的潜力。

weixin_29290963的博客 1825

Npgsql.Bulk:高效处理PostgreSQL批量数据操作的.NET库

Npgsql.Bulk:高效处理PostgreSQL批量数据操作的.NET库 项目介绍 Npgsql.Bulk 是一个专为 .NET 开发者设计的库,它旨在简化 PostgreSQL 数据库的大规模数据导入导出过程。由于 .NET 标准的 SqlBulkCopy 类不支持 PostgreSQL,Npgsql.Bulk 应运而生,利用 PostgreSQL 的 COPY 命令来实现高效的批量数据传输...

gitblog_00630的博客 1221

基于PChmi.dll的PLC报警显示和记录(C#)

本文介绍了如何使用C#编写基于PChmi.dll的程序,实现PLC报警的显示和记录功能。通过订阅PLC的报警事件,我们可以实时显示报警信息,并通过日志文件记录报警历史。PLC(可编程逻辑控制器)在工业自动化领域中扮演着重要的角色,而报警显示和记录是PLC应用中常见的需求。本文将介绍如何使用C#编写基于PChmi.dll的程序,实现PLC报警的显示和记录功能。当然,这只是实现报警显示和记录的基本框架,具体的实现方式可能因不同的PLC和HMI库而有所差异。你需要根据你所使用的具体库和设备进行相应的调整和修改。

ByteLegend的博客 1673

Npgsql.Bulk:高性能批量操作指南

Npgsql.Bulk:高性能批量操作指南 Npgsql.Bulk 是一个专为 .NET 平台设计的 PostgreSQL 数据库的批量处理工具,旨在简化大量数据的快速导入和更新过程。接下来,我们将基于仓库 https://github.com/neisbut/Npgsql.Bulk.git 结构,指导您理解并运用这个项目。 1. 项目目录结构及介绍 ├── Npgsql.Bulk.csproj ...

gitblog_01155的博客 775

【ATC/DTC方法第一期】经典平均/昼夜温度周期ATC/DTC方法介绍(含Python代码实现)

【ATC/DTC方法第一期】经典平均/昼夜温度周期ATC/DTC方法介绍(含Python代码实现)

WW、forever的博客 486

深度学习实战12(进阶版)-利用Dewarp实现文本扭曲矫正

大家好,我是微学A1, 我们在生活中会看到一些拍摄扭曲的图片,我们在通过OCR识别的时候,因为扭曲的厉害,而无法识别,我们需要对图片进行处理。

微学AI的博客 3157

Npgsql批量数据操作指南:高效导入导出PostgreSQL数据的最佳实践

Npgsql作为PostgreSQL的.NET数据提供程序,提供了强大的批量数据处理能力,帮助开发者快速实现PostgreSQL数据库的高效数据导入与导出。本文将详细介绍Npgsql批量操作的核心功能、实现方法及最佳实践,让你轻松掌握百万级数据的处理技巧。 ## 为什么选择Npgsql进行批量操作? PostgreSQL的COPY命令是处理大量数据的高效方式,相比传统的INSERT/SELEC

gitblog_01133的博客 528

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#.net使用npgsql批量写入数据入库到postgresql数据库

注:BeginBinaryImport(“copy drp_app_track_event(session_id,duration,start_time,trace_id,parent_trace_id,event_type,event_code,action_code,user_id,user_info,event_data) FROM STDIN BINARY”))当有类型限定时,例如jsonb,在单条存储时 在sql语句中使用‘@event_data::jsonb’此形式。

江河键行的博客 2346

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

探索数据处理新境界:Npgsql.Bulk——高效ORM集成利器

探索数据处理新境界:Npgsql.Bulk——高效ORM集成利器 在高速发展的数据驱动时代,数据处理的效率成为了每个开发者不可忽视的核心问题。今天,让我们一同探索一个旨在简化大规模数据插入与更新操作的开源神器——Npgsql.Bulk。这款工具结合了Entity Framework和Npgsql的强大力量,为.NET开发者们开启了数据批量操作的新篇章。 项目介绍 Npgsql.Bulk是一个轻巧而...

gitblog_00899的博客 1033

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

.net使用npgsql批量写入数据

当有类型限定时,例如jsonb,在单条存储时 在sql语句中使用‘@event_data::jsonb’此形式。多条存储遇到类型限定,在write写入时,加入‘NpgsqlDbType.Jsonb’限定。

lwy 750

Npgsql.FSharp 使用教程

Npgsql.FSharp 使用教程 项目介绍 Npgsql.FSharp 是一个轻量级的 F# 包装库,围绕 Npgsql(.NET 的 PostgreSQL 数据库驱动程序)构建。它旨在为 F# 开发者提供一个更加函数式和惯用的方式来与 PostgreSQL 数据库进行交互。Npgsql.FSharp 提供了嵌入式 SQL 语法分析、参数和结果集的类型检查以及可空列检测等功能,使得编写查询更加...

gitblog_00100的博客 662

推荐使用:Npgsql - .NET连接PostgreSQL的首选数据提供者

推荐使用:Npgsql - .NET连接PostgreSQL的首选数据提供者 项目地址:https://gitcode.com/gh_mirrors/np/npgsql 在.NET开发中寻找一个强大且可靠的数据库连接器?Npgsql是你的理想选择。它是一个开源的.NET数据提供者,专为PostgreSQL设计,提供高效、全面的功能集,使开发者能够充分利用PostgreSQL的强大功能。 项目介绍 ...

gitblog_00082的博客 1154

Npgsql 项目教程

Npgsql 是一个用于 .NET 的 PostgreSQL 数据库驱动程序。以下是 Npgsql 项目的主要目录结构及其介绍: ``` npgsql/ ├── src/ │ ├── Npgsql/ │ │ ├── Core/ │ │ ├── TypeMapping/ │ │ ├── Logging/ │ │ ├── ... │ ├── Npgsql.En...

gitblog_00970的博客 1054

【亲测免费】 Npgsql.Bulk 项目常见问题解决方案

Npgsql.Bulk 项目常见问题解决方案 1. 项目基础介绍和主要编程语言 Npgsql.Bulk 是一个开源项目,它提供了使用 Entity Framework 和 Npgsql 进行高效批量插入和更新的功能。这个项目主要是为了解决在处理大量数据时,传统插入和更新方法效率低下的难题。项目使用 C# 编程语言开发,支持 .NET 4.5 和 .NET Standard 2.0。 2. 新手常见...

gitblog_00369的博客 672
上一篇: Npgsql使用入门(二)【实用助手类】
下一篇: Kafka入门经典(官网翻译)
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值