用SqlBulkCopy批量插入数据到SqlServer数据库表中
首先创建一个数据库连接类:SQLHelper
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data.SqlClient;
- using System.Data;
- namespace insetData
- {
- public class SQLHelper
- {
- public static readonly string Strconn = "Data Source=LocalHost;database=CardID;uid=sa;pwd=123";
- /// <summary>
- /// 创建SqlConnection对象
- /// </summary>
- /// <returns></returns>
- public static SqlConnection sqlConn()
- {
- return new SqlConnection(Strconn);
- }
- /// <summary>
- /// SQLServer批量插入数据功能
- /// 这是SQLServer特有的功能,故不再上层抽象类中编写
- /// </summary>
- /// <param name="dt">数据表</param>
- /// <param name="tableName">表名称</param>
- public static void BulkInsert(SqlConnection conn, DataTable dt, string tableName)
- {
- if (string.IsNullOrEmpty(tableName))
- {
- throw new ArgumentNullException("请指定需要插入的数据表");
- }
- var count = dt.Rows.Count;
- if (count == )
- {
- return;
- }
- if (conn.State == ConnectionState.Closed)
- {
- conn.Open();
- }
- //SqlBulkCopy用其他源的数据有效批量加载 SQL Server 表
- using (SqlBulkCopy copy = new SqlBulkCopy(conn))
- {
- copy.BatchSize = dt.Rows.Count;//每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。
- copy.DestinationTableName = tableName;//指定目标表
- copy.WriteToServer(dt);//将dt中的所有行复制到SqlBulkCopy对象的DestinationTableName指定的目标表中
- conn.Close();
- conn.Dispose();
- }
- }
- /// <summary>
- /// 创建数据表
- /// </summary>
- /// <param name="columns"></param>
- public static DataTable CreateTable(IList<string> columns)
- {
- var dt = new DataTable();
- foreach (var c in columns)
- {
- dt.Columns.Add(c);
- }
- return dt;
- }
- /// <summary>
- /// 批量插入数据
- /// </summary>
- /// <param name="tableName">数据表</param>
- /// <param name="columns">字段</param>
- /// <param name="dataList">数据列表</param>
- /// <param name="action">具体操作</param>
- public static void CreateInner<T>(SqlConnection conn, string tableName, IList<string> columns, IList<T> dataList, Action<DataRowWaper, T, int> action)
- {
- if (string.IsNullOrEmpty(tableName))
- {
- throw new ArgumentNullException("需要指定操作的数据表");
- }
- if (columns == null || columns.Count == )
- {
- throw new ArgumentNullException("数据表列不能为空");
- }
- var dt = CreateTable(columns);
- if (action != null)
- {
- for (var i = ; i < dataList.Count; i++)
- {
- var wapper = new DataRowWaper(dt.NewRow());
- action(wapper, dataList[i], i);
- dt.Rows.Add(wapper.Row);
- }
- }
- BulkInsert(conn, dt, tableName);
- }
- }
- }

- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data.SqlClient;
- using System.Data;
- namespace insetData
- {
- public class SQLHelper
- {
- public static readonly string Strconn = "Data Source=LocalHost;database=CardID;uid=sa;pwd=123";
- /// <summary>
- /// 创建SqlConnection对象
- /// </summary>
- /// <returns></returns>
- public static SqlConnection sqlConn()
- {
- return new SqlConnection(Strconn);
- }
- /// <summary>
- /// SQLServer批量插入数据功能
- /// 这是SQLServer特有的功能,故不再上层抽象类中编写
- /// </summary>
- /// <param name="dt">数据表</param>
- /// <param name="tableName">表名称</param>
- public static void BulkInsert(SqlConnection conn, DataTable dt, string tableName)
- {
- if (string.IsNullOrEmpty(tableName))
- {
- throw new ArgumentNullException("请指定需要插入的数据表");
- }
- var count = dt.Rows.Count;
- if (count == 0)
- {
- return;
- }
- if (conn.State == ConnectionState.Closed)
- {
- conn.Open();
- }
- //SqlBulkCopy用其他源的数据有效批量加载 SQL Server 表
- using (SqlBulkCopy copy = new SqlBulkCopy(conn))
- {
- copy.BatchSize = dt.Rows.Count;//每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。
- copy.DestinationTableName = tableName;//指定目标表
- copy.WriteToServer(dt);//将dt中的所有行复制到SqlBulkCopy对象的DestinationTableName指定的目标表中
- conn.Close();
- conn.Dispose();
- }
- }
- /// <summary>
- /// 创建数据表
- /// </summary>
- /// <param name="columns"></param>
- public static DataTable CreateTable(IList<string> columns)
- {
- var dt = new DataTable();
- foreach (var c in columns)
- {
- dt.Columns.Add(c);
- }
- return dt;
- }
- /// <summary>
- /// 批量插入数据
- /// </summary>
- /// <param name="tableName">数据表</param>
- /// <param name="columns">字段</param>
- /// <param name="dataList">数据列表</param>
- /// <param name="action">具体操作</param>
- public static void CreateInner<T>(SqlConnection conn, string tableName, IList<string> columns, IList<T> dataList, Action<DataRowWaper, T, int> action)
- {
- if (string.IsNullOrEmpty(tableName))
- {
- throw new ArgumentNullException("需要指定操作的数据表");
- }
- if (columns == null || columns.Count == 0)
- {
- throw new ArgumentNullException("数据表列不能为空");
- }
- var dt = CreateTable(columns);
- if (action != null)
- {
- for (var i = 0; i < dataList.Count; i++)
- {
- var wapper = new DataRowWaper(dt.NewRow());
- action(wapper, dataList[i], i);
- dt.Rows.Add(wapper.Row);
- }
- }
- BulkInsert(conn, dt, tableName);
- }
- }
- }

其次创建DataRowWaper类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- namespace insetData
- {
- public class DataRowWaper
- {
- private DataRow row = null;
- public DataRowWaper(DataRow row)
- {
- this.row = row;
- }
- public DataRow Row
- {
- get
- {
- return this.row;
- }
- }
- public object this[DataColumn column]
- {
- get
- {
- return this.row[column];
- }
- set
- {
- this.row[column] = value;
- }
- }
- public object this[int columnIndex]
- {
- get
- {
- return this.row[columnIndex];
- }
- set
- {
- this.row[columnIndex] = value;
- }
- }
- public object this[string columnName]
- {
- get
- {
- return this.row[columnName];
- }
- set
- {
- this.row[columnName] = value;
- }
- }
- public void SetValue(string key, object value)
- {
- this.row[key] = value;
- }
- }
- }

- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- namespace insetData
- {
- public class DataRowWaper
- {
- private DataRow row = null;
- public DataRowWaper(DataRow row)
- {
- this.row = row;
- }
- public DataRow Row
- {
- get
- {
- return this.row;
- }
- }
- public object this[DataColumn column]
- {
- get
- {
- return this.row[column];
- }
- set
- {
- this.row[column] = value;
- }
- }
- public object this[int columnIndex]
- {
- get
- {
- return this.row[columnIndex];
- }
- set
- {
- this.row[columnIndex] = value;
- }
- }
- public object this[string columnName]
- {
- get
- {
- return this.row[columnName];
- }
- set
- {
- this.row[columnName] = value;
- }
- }
- public void SetValue(string key, object value)
- {
- this.row[key] = value;
- }
- }
- }

映射到数据库对象表信息People
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace insetData
- {
- public class People
- {
- public int id { get; set;}
- public string uname { get; set; }
- public string era { get; set; }
- public string amount { get; set; }
- }
- }

- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace insetData
- {
- public class People
- {
- public int id { get; set;}
- public string uname { get; set; }
- public string era { get; set; }
- public string amount { get; set; }
- }
- }

批量操作数据
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- using System.Diagnostics;
- using System.Data.SqlClient;
- namespace insetData
- {
- class Program
- {
- static void Main(string[] args)
- {
- //构造的数据源
- List<People> list = new List<People>()
- {
- new People(){ uname="张亮",era="中年",amount=""},
- new People(){ uname="天天",era="年轻",amount=""},
- new People(){ uname="kimi",era="年轻",amount=""}
- };
- //列名称
- var lists = new[] { "id", "uname", "era", "amount" };
- ////构建DataTable
- //DataTable dt = new DataTable();
- //foreach (var item in lists)
- //{
- // dt.Columns.Add(item, item.GetType());
- //}
- //for (int i = 0; i < list.Count; i++)
- //{
- // DataRow newRow = dt.NewRow();
- // newRow["uname"] = list[i].uname;
- // newRow["era"] = list[i].era;
- // newRow["amount"] = list[i].amount;
- // dt.Rows.Add(newRow);
- //}
- ////批量插入
- //SQLHelper.BulkInsert(SQLHelper.sqlConn(), dt, "Tb_People");
- //上面这段代码是直接构造的DataTable
- SQLHelper.CreateInner<People>(SQLHelper.sqlConn(), "Tb_People", lists, list,
- (curow, People, i) =>
- {
- curow["id"] = People.id;
- curow["uname"] = People.uname;
- curow["era"] = People.era;
- curow["amount"] = People.amount;
- }
- );
- }
- }
- }

- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- using System.Diagnostics;
- using System.Data.SqlClient;
- namespace insetData
- {
- class Program
- {
- static void Main(string[] args)
- {
- //构造的数据源
- List<People> list = new List<People>()
- {
- new People(){ uname="张亮",era="中年",amount="100000"},
- new People(){ uname="天天",era="年轻",amount="233233"},
- new People(){ uname="kimi",era="年轻",amount="455631"}
- };
- //列名称
- var lists = new[] { "id", "uname", "era", "amount" };
- ////构建DataTable
- //DataTable dt = new DataTable();
- //foreach (var item in lists)
- //{
- // dt.Columns.Add(item, item.GetType());
- //}
- //for (int i = 0; i < list.Count; i++)
- //{
- // DataRow newRow = dt.NewRow();
- // newRow["uname"] = list[i].uname;
- // newRow["era"] = list[i].era;
- // newRow["amount"] = list[i].amount;
- // dt.Rows.Add(newRow);
- //}
- ////批量插入
- //SQLHelper.BulkInsert(SQLHelper.sqlConn(), dt, "Tb_People");
- //上面这段代码是直接构造的DataTable
- SQLHelper.CreateInner<People>(SQLHelper.sqlConn(), "Tb_People", lists, list,
- (curow, People, i) =>
- {
- curow["id"] = People.id;
- curow["uname"] = People.uname;
- curow["era"] = People.era;
- curow["amount"] = People.amount;
- }
- );
- }
- }
- }


- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- using System.Diagnostics;
- using System.Data.SqlClient;
- namespace insetData
- {
- class Program
- {
- static void Main(string[] args)
- {
- //构造的数据源
- List<People> list = new List<People>()
- {
- new People(){ uname="张亮",era="中年",amount="100000"},
- new People(){ uname="天天",era="年轻",amount="233233"},
- new People(){ uname="kimi",era="年轻",amount="455631"}
- };
- //列名称
- var lists = new[] { "id", "uname", "era", "amount" };
- ////构建DataTable
- //DataTable dt = new DataTable();
- //foreach (var item in lists)
- //{
- // dt.Columns.Add(item, item.GetType());
- //}
- //for (int i = 0; i < list.Count; i++)
- //{
- // DataRow newRow = dt.NewRow();
- // newRow["uname"] = list[i].uname;
- // newRow["era"] = list[i].era;
- // newRow["amount"] = list[i].amount;
- // dt.Rows.Add(newRow);
- //}
- ////批量插入
- //SQLHelper.BulkInsert(SQLHelper.sqlConn(), dt, "Tb_People");
- //上面这段代码是直接构造的DataTable
- SQLHelper.CreateInner<People>(SQLHelper.sqlConn(), "Tb_People", lists, list,
- (curow, People, i) =>
- {
- curow["id"] = People.id;
- curow["uname"] = People.uname;
- curow["era"] = People.era;
- curow["amount"] = People.amount;
- }
- );
- }
- }
- }

用SqlBulkCopy批量插入数据到SqlServer数据库表中的更多相关文章
- .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库
批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...
- C#批量插入数据到Sqlserver中的四种方式
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
- C#批量插入数据到Sqlserver中的三种方式
本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...
- C#_批量插入数据到Sqlserver中的四种方式
先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...
- C# 之 批量插入数据到 SQLServer 中
创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如 ...
- C#批量插入数据到Sqlserver中的四种方式 - 转
先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...
- 【转载】C#批量插入数据到Sqlserver中的三种方式
引用:https://m.jb51.net/show/99543 这篇文章主要为大家详细介绍了C#批量插入数据到Sqlserver中的三种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本篇, ...
- sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
- SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法
原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...
随机推荐
- 关于C++中Object所占内存空间探索1
关于C++中Object所占内存空间探索(一) 有如下问题: 1. 一个空类, class X{ }; 2.类中含有数据成员(Data Member), class X { public: //Fun ...
- [置顶] linux学习之samba安装问题详解
一.首先查看是否安装samba,命令为:rpm -qa | grep samba 出现如下包表示已经安装,否则没有安装 samba-winbind-clients-3.5.10-125.el6.i68 ...
- python手记(11)
<form method="POST" action="http://host.com/cgi-bin/test.py"> <p>You ...
- Html中DIV成为超级链接,解决在360浏览器+IE9显示小手图标的兼容性!
Html中DIV成为超级链接,解决在360浏览器+IE9显示小手图标的兼容性! <div style="cursor:pointer;" onclick="sele ...
- ADO.NET—两种连接模式
一.ADO.NET简介 ADO.NET的名称起源于ADO(ActiveX Data Objects),这是一个广泛的类组,用于在以往的Microsoft技术中访问数据.用来访问数据库,.NET环境下首 ...
- Android开发之简单的电子相册实现
电子相册的效果图和结构图: 图片资源的文件: package com.example.electronicalbum; public interface ImageResource { //用一个 ...
- Java开发工具箱-JDK的安装与配置
一.JDK.JRE 术语名 缩写 解释 Java Development Kit JDK Java程序员用的工具包 Java Runtime Enviroment JRE Java程序的运行环境 二. ...
- C++ 头文件系列(stack)
简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ...
- C++ STD accumulate函数
1. 介绍 用来计算特定范围内(包括连续的部分和初始值)所有元素的和,除此之外,还可以用指定的二进制操作来计算特定范围内的元素结果.其头文件在numeric中. 用次函数可以求和,构造前n项和的向量, ...
- Linux界面自动化测试框架不完全汇总
首先可参考wiki此文,非常详尽:https://en.wikipedia.org/wiki/List_of_GUI_testing_tools 以下是我调研并实验过的(实验环境ubuntu 16.0 ...