Ado.net批量插入数据

2023-11-13

采用的是SqlBulkCopy方法:数据库是sql server。
示例代码地址:

https://gitee.com/Alexander360/LearnAdoNet

SqlBulkCopy批量插入的方法如下,包括list转datatable方法:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace LearnAdoNet
{
    public static class SqlHelper
    {
        /// <summary>
        /// 批量插入
        /// </summary>
        /// <param name="conn"></param>
        /// <param name="list">源数据</param>
        public  static void BulkCopy<T>(IDbConnection conn, IEnumerable<T> list)
        {
            var dt = list.ToDataTable();

            using (conn)
            {
                if (conn.State == ConnectionState.Closed)
                    conn.Open();

                using (var sqlbulkcopy = new SqlBulkCopy((SqlConnection)conn))
                {
                    sqlbulkcopy.DestinationTableName = dt.TableName;
                    for (var i = 0; i < dt.Columns.Count; i++)
                    {
                        sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                    }
                    sqlbulkcopy.WriteToServer(dt);
                }
            }
        }

        /// <summary>
        /// 把列表转换为DataTable
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns></returns>
        public static DataTable ToDataTable<T>(this IEnumerable<T> list)
        {
            var type = typeof(T);

            var properties = type.GetProperties().ToList();

            var newDt = new DataTable(type.Name);

            properties.ForEach(propertie =>
            {
                Type columnType;
                if (propertie.PropertyType.IsGenericType && propertie.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    columnType = propertie.PropertyType.GetGenericArguments()[0];
                }
                else
                {
                    columnType = propertie.PropertyType;
                }

                newDt.Columns.Add(propertie.Name, columnType);
            });

            foreach (var item in list)
            {
                var newRow = newDt.NewRow();

                properties.ForEach(propertie =>
                {
                    newRow[propertie.Name] = propertie.GetValue(item, null) ?? DBNull.Value;
                });

                newDt.Rows.Add(newRow);
            }

            return newDt;
        }
    }

}

测试方法:

        /// <summary>
        /// 批量插入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBulkCopy_Click(object sender, EventArgs e)
        {
            List<Student> students = new List<Student>();
            for (int i = 0; i < 1000; i++)
            {
                students.Add(new Student()
                {
                    Name = "User" + i,
                    Age = i % 5 + 15,
                    EnrollmentDate=DateTime.Now
                });
            }

            try
            {
                string strConn = Properties.Settings.Default.SchoolConn;
                IDbConnection conn = new SqlConnection(strConn);
                SqlHelper.BulkCopy<Student>(conn, students);
                MessageBox.Show("批量插入成功");
            }
            catch (Exception)
            {
                MessageBox.Show("批量插入失败");
            }

        }
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public DateTime EnrollmentDate { get; set; }

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ado.net批量插入数据 的相关文章

随机推荐

  • 使用 Socket 通信实现 FTP 客户端程序

    转 https www ibm com developerworks cn linux l cn socketftp index html FTP FTP 概述 文件传输协议 FTP 作为网络共享文件的传输协议 在网络应用软件中具有广泛的应
  • python是一门面向过程的语言有哪些,python是面向过程的吗

    python是面向过程的吗 1 面向过程 核心是过程二字 过程指的是解决问题的步骤 好比如设计一条流水线 是一种机械式的思维方式 就是程序从上到下一步步执行 一步步从上到下 从头到尾的解决问题 基本设计思路就是程序一开始是要着手解决一个大的
  • 迷你Web文件服务器

    在开发Web程序的时候 有时候需要一个轻量级的Web服务器 用来响应前端的请求 前端一般的请求可以通过本地文件的方式显示 但是毕竟不是真正的Web服务器 有了这个需求 我们开发了一款迷你绿色通用的Web文件服务器 下载地址 WebServe
  • Ubuntu16.04.7+Qt15.5.0环境配置(一条龙讲解)

    目录 1 下载并安装Ubuntu 2 Qt下载与安装 3 Qt环境配置 4 设置编译套件 5 创建qt快速启动脚本 1 下载并安装Ubuntu Ubuntu16 04 7下载链接https releases ubuntu com xenia
  • ipconfig bash: ipconfig: command not found...

    在使用linux查看端口的时候 应该用ifconfig Windows才使用ipconfig
  • Qt 操作SQLite数据库

    一 SQLite 介绍 Sqlite 数据库作为 Qt 项目开发中经常使用的一个轻量级的数据库 可以说是兼容性相对比较好的数据库之一 Sqlite就像Qt的亲儿子 如同微软兼容Access数据库一样 Qt5 以上版本可以直接使用 Qt自带驱
  • 09字符串排序

    给定两个字符串 从字符串2中找出字符串1中的所有字符 去重并按照ASCII码值从小到大排列 输入字符串1长度不超过1024 字符串2长度不超过100 字符范围满足ASCII编码要求 按照ASCII由小到大排序 输入描述 bach bbaac
  • CBAM:融合通道和空间注意力的注意力模块

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 Sik Ho Tsang 编译 ronghuaiyang 导读 使用CBAM加持的MobileNetV1 ResNeXt ResNet WRN优于使用SENet的网络 在这篇文章
  • java:统计数组中元素出现的个数

    问题描述 定义一个方法传入一个int类型数组 输出这个数组中每一个数字及其出现的个数 例如 传入数组 1 2 2 2 3 3 4 4 4 4 打印结果 数字1出现了1次 数字2出现了3次 算法思想 这里主要是在实现数组元素的遍历过程中 如果
  • Springboot 整合mybatis-plus +代码生成器

    mybatis plus官方文档 https mp baomidou com guide 新建一个Springboot项目 代码生成结构如下 一 添加依赖
  • el-dialog弹窗改变默认样式,改变弹窗高度位置

    el dialog弹窗改变默认样式 改变弹窗高度位置 在el dialog上添加class view dialog
  • 4https 原理

    春光正暖 情绪微高 穿行于街巷 浮现三两过往事 不惧时光肆意流淌 新的一年 万事顺遂 文章目录 1 http的缺点 2 加密算法 2 1 对称加密 2 2 非对称加密 算法的实现的思路 公钥加密 私钥解密 2 3 ca的诞生 ca如何生成证
  • python---装饰器进阶之路

    装饰器的本质 在不改变被装饰对象原有的 调用方式 和 内部代码 的情况下给被装饰对象添加新的功能 装饰器的原则 对扩展开放 对修改封闭 为何要用装饰器 软件的设计应该遵循开放封闭原则 即对扩展是开放的 而对修改是封闭的 对扩展开放 意味着有
  • PR/AE/FCPX比较好用的插件有哪些?

    Beauty Box 磨皮润肤美容插件 Digital Anarchy比较出众的一款视频磨皮美白降噪插件 支持系统 windows Mac 软件版本 PR AE CS6 2023 Davinci Resolve 达芬奇11以上 FCPX 1
  • 机器学习二:支持向量机

    支持向量机 1 介绍 2 对偶问题 3 非线性数据 3 1 核函数与核技巧 3 1 1 数学解释 3 1 2 几种常用的核函数 4 SVM 响应离群点 4 1 软间隔 4 2 正则化 4 3 参数调整 4 3 1 SVM C Paramet
  • OpenGL学习书籍推荐

    1 opengl 红宝书 2 Nehe的Opengl教程 网上的文章 能形成一个完整系列的就是 Nehe的 有点老 不过不影响学习理论 3 知乎上的这个帖子也提供了不少思路 https www zhihu com question 2416
  • 汉堡王什么汉堡好吃_汉堡王9款汉堡测评,牛肉和鸡肉你喜欢哪个?

    从第一次吃汉堡王到现在已经好久了 数了一下 他们家的汉堡我已经吃了9种了 虽然还没有全部吃过一遍 今天就来盘点一下汉堡王的汉堡吧 小皇堡 第一次吃的就是小皇堡 当时不是很能吃得惯 所以从那时起就有点不太敢尝试皇堡系列 后来真香了 里面有西红
  • [中奖]第九届“泰迪杯”挑战赛A题

    问题概述 题目1如下 赛题有2个点 分别是 确定数据指标 即确定哪些特征是决定财务造假与否的关键特征 预测造假公司 训练模型 然后跑测试数据即可 预处理 首先使用missingno2 对全局数据进行观测 看一看缺失值等情况 然后删去无用的特
  • retrofit应用详解与源码解析--源码解析

    本文出自门心叼龙的博客 属于原创类容 未经允许 不得转载 本专栏的同步视频教程已经发布到CSDN学院 https edu csdn net course detail 30408 上一篇文章我们通过12个小案例 给大家演示了retrofit
  • Ado.net批量插入数据

    采用的是SqlBulkCopy方法 数据库是sql server 示例代码地址 https gitee com Alexander360 LearnAdoNet SqlBulkCopy批量插入的方法如下 包括list转datatable方法