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

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 里面的数据量是否已经超过规定最大行数 maxNumif (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 locatedtile_y integer,             --y index of the map tile where the building is locatedbps_gc polygon NOT NULL,    --the points of the bottom outline of the building, geodetic coordinatesbps_llc polygon NOT NULL,   --the points of the bottom outline of the building, Latitude and longitude coordinatescp_gc point NOT NULL,       --the center point of the building, geodetic coordinatescp_llc point NOT NULL,      --the center point of the building, Latitude and longitude coordinatesname text,bld_floor smallint,         --the number of floors of the buildingheight 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;}elseFullTableName = 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);}}}
}

运行结果如图:

这里写图片描述


这里写图片描述

转载于:https://www.cnblogs.com/Wulex/p/6953527.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程网络视频监视技术

目前要实现广域网视频监视&#xff0c;主要通过三种方式实现&#xff1a;1.硬盘录像机&#xff1b;2.网络视频服务器&#xff1b;3.网络摄像机。 硬盘录像机是一个以录像为主的设备&#xff0c;有的可以支持IE浏览。网络视频服务器一般前端不录像&#xff0c;直接将影像传输到…

Deepin下java开发环境部署

简介 本经验由深度论坛用户(zhang12345shun)分享&#xff0c;原文地址 正文 SUN JDK&#xff08;现已改名Oracle JDK&#xff09; 1.下载Sun版JDK压缩包&#xff08;.tar.gz&#xff09;&#xff0c;选择其中的32/64位Linux版本。 2.将其解压缩&#xff1a; sudo tar -zx…

判断ic卡类型

传15读卡片数据 判断data8的status是否为0&#xff0c;是则是ic 否则就是磁条卡 根据二磁道数据识别是IC卡还是磁条卡 根据二磁道符号后面第一位识别。规则是 该数字 6 或者 2 则该卡是IC卡&#xff0c;否则是普通磁条卡 转载于:https://www.cnblogs.com/wubenhui/p/6956256.h…

python常用代码_Python常用算法学习(3)(原理+代码)——最全总结

1&#xff0c;什么是算法的时间和空间复杂度算法(Algorithm)是指用来操作数据&#xff0c;解决程序问题的一组方法&#xff0c;对于同一个问题&#xff0c;使用不同的算法&#xff0c;也许最终得到的结果是一样的&#xff0c;但是在过程中消耗的资源和时间却会有很大的区别。那…

数据监测驱动下的信息流广告优化

信息流广告是什么 “今日头条和百度必有一战”&#xff0c;相信不少的互联网人在过去几个月都听到过类似的断言。定位于信息分发平台的今日头条和主营搜索业务的百度会产生如此大的利益冲突&#xff0c;最核心的点其实就是信息流广告。 信息流广告指的是在用户使用互联网产品或…

在idea中使用git管理你的项目

起步 idea是十分智能的Java集成开发环境 而我们在用idea写项目的时候经常遇到版本控制的问题,而git工具如果你只会在终端中的git命令来进行控制,可能会使得效率低下 今天小编就教大家在idea中使用git来管理你的项目 首先创建一个项目 点击create new projects 这里选择默认…

react-native热更新插件react-native-code-push

使用react-native-code-push插件来实现热更新的时候&#xff0c;会遇到一些问题。下面这个问题就让我差点崩溃了。 在测试 Production 和 Staging 是否会去检查各自环境下的bundle文件&#xff0c;我就遇到了混乱的问题。 有时候用 Release 打包出来的app会去检查 Staging 下的…

《工业控制网络安全技术与实践》一一第3章 工业控制网络安全威胁

第3章 工业控制网络安全威胁 第2章介绍了工业控制系统的相关知识。本章主要介绍工业控制网络的基本知识&#xff0c;并详细介绍工业控制网络的常见安全威胁。之后&#xff0c;分析工业控制系统的脆弱性。

多媒体视频知识入门贴zt(二)

2.2 音视频基本概念介绍 2.2.1 视频的基本概念 RGB和YUV RGB指的是红绿蓝&#xff0c;应用还是很广泛的&#xff0c;比如显示器显示&#xff0c;BMP文件格式中的像素值等&#xff1b;而YUV主要指亮度和两个色差信号&#xff0c;被称为luminance和chrominance他们的转化关系可以…

Java笔记01-数组相关

数组相关 数组的创建 数据类型[] 数组名称 new 数据类型[数组的长度]其中数据类型可以为任意类型 数组的访问 • 调用数组的length属性可以获取数组的长度&#xff1a; int len arr.length;• 可以通过下标的方式访问数组中的每一个元素。 需要注意的是&#xff1a;数组…

偏好设置

转载于:https://www.cnblogs.com/xufengyuan/p/6959424.html

keyshot环境素材文件_快速学会keyshot基础渲染的步骤

KeyShot是基于CPU为三维数据进行渲染和动画操作的独立渲染器。意为“The Key to Amazing Shots”&#xff0c;是一个互动性的光线追踪与全域光渲染程序&#xff0c;无需复杂的设定即可产生相片般真实的 3D 渲染影像。KeyShot超强的渲染能力广泛的应用于工业产品、机械工程、CG行…

传统数据中心如何实现向云的平滑升级

1.引言 众所周知&#xff0c;云计算是近年来发展最快的互联网技术&#xff0c;被称为第四次IT革命。据权威机构预测&#xff0c;到2016年&#xff0c;2/3的IT应用服务将建立在云架构上 [1]。作为云计算核心的基础承载设施&#xff0c;数据中心在网络中所扮演的角色也愈加重要。…

UGUI滚动列表ScrollView使用注意点

ScrollView的Viewport不能引用其子节点Grid&#xff0c;不然会导致ScrollView滚到头时还能继续滚动&#xff0c;无法回滚 转载于:https://www.cnblogs.com/lovesharing/p/6963062.html

Java笔记02-OOP

面向对象编程 万物皆对象 面向对象指以属性和行为的观点去分析现实生活中的事物 面向对象编程指先以面向对象的思想进行分析,然后使用面向对象的编程语言进行表达的过程 面向对象编程是软件产业化发展的需求 理解面向对象的思想精髓才行 面想对象的三大特性 封装 继承 …

上位机与基恩士plc以太网通讯_2020湛江AB罗克韦尔PLC主机回收二手或全新

2020湛江AB罗克韦尔PLC主机回收二手或全新专业回收基恩士光电传感器回收&#xff0c;基恩士安全光栅回收&#xff0c;基恩士对射开关回收&#xff0c;基恩士工控配件回收&#xff0c;基恩士视觉相机回收&#xff0c;发那科伺服驱动电机回收&#xff0c;发那科控制系统回收&…

经常使用的 WEB server

对于刚開始学习的人来说&#xff0c;或许自己能够写出一些简单的演示样例DEMO&#xff0c;但却纠结于不知道应该怎样才干訪问自己的页面&#xff0c;这里进行了一些简单的WEBserver总结。便于新朋友配置使用 静态HTML页面 对于静态HTML页面不须要webserver&#xff0c;直接右键…

多媒体视频知识入门贴zt(一)

一 基础篇 1.1 图形、图像和视频图形&#xff08;graphic&#xff09;&#xff1a;和图像与视频不同&#xff0c;有一种说法是图形就是自然界的客观世界不存在的图案。对于计算机中的图形研究&#xff0c;有专门的计算机图形学&#xff0c;主要的 研究对象是点、线、面等抽象事…

Java笔记03-Constructor Override

Java笔记03-Constructor & Override 构造方法基本概念 构造方法是类中的一种特殊方法 它是在类创建对象(实例化)的时候自动调用的方法 这个和python中的__init__初始化魔术方法类似 可以在创建对象的时候进行参数的传递 默认送您的构造 一个类编译过后都需要有一个构…

生物信息学概论_大学专业详解系列83——生物信息学(理学学士)

生物信息学(理学学士)毕业生应具备的知识和能力(1)掌握扎实的数学、物理、化学基础理论和基本知识&#xff1b;(2)掌握生物学专业基础知识和信息处理的专门知识&#xff1b;(3)掌握普通生物学、细胞生物学、遗传学、分子生物学、生物数据库管理系统、生物信息学、基因组学、蛋白…