用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 ...
随机推荐
- 统计知识选讲(一)——主成分分析(PCA)的思想
主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异,将我们手中许多相关性很高的变量转化成彼此相互独立或不相关的变量,从而达到降维的目的.在原始数据“预处理”阶段通常要先对它们采用PCA ...
- SPFILE 、PFILE 的全面解读
这里先阐述一下数据库的启动过程: 1. 启动实例/例程(nomount状态)时,读取参数文件(文本文件PFILE 或服务器参数文件SPFILE),分配SGA.启动后台进程.打开告警文件及后台 ...
- 更新android SDK的问题
由于我大天朝将google屏蔽的原因,在更新android SDK的时候,可能速度慢还是个小问题,重要的是你更新的时候出各种错误,比如错误 Failed to fetch URL https ...
- mysqldump备份错误:诡异的#mysql50#.mozilla数据库
今天测试mysql自动备份功能 在red_hat_linux5系统下安装了mysql_5.5 系统提示执行脚本抛错, 手动执行脚本, 返回错误:mysqldump: Got error: 1102: ...
- 设置RichEdit相关颜色说明
1.设置RichEdit客户区的背景颜色 要设置RichEdit的背景色,需要发送 EM_SETBKGNDCOLOR 消息给RichEdit控件,关于该消息的说明:wParam参数 为颜色选项,如果是 ...
- Ubuntu下OpenVPN客户端配置教程
一般来说,提供Web服务的Linux服务器是很少需要连接OpenVPN的,但是个人Linux计算机在很多时候就需要连接OpenVPN了.比如以Linux为开发环境,需要连接公司的OpenVPN等等. ...
- Warensoft Stock Service Api客户端接口说明
Warensoft Stock Service Api客户端接口说明 Warensoft Stock Service Api Client Reference 可使用环境(Available Envi ...
- Docker 基础 : 网络配置
大量的互联网应用服务包含多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合.Docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务.接下来我们将讲述 Docker ...
- 写一个MyList
首先定义接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...
- ES6 带来了什么
http://www.kuqin.com/shuoit/20150928/348317.html 这篇文章介绍了javascript 的大致历史 http://www.css88.com/archi ...