用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 ...
随机推荐
- 对dump脱壳的一点思考
对dump脱壳的一点思考 偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能 ...
- 对象转Json序列化
C#--对象转Json序列化 前言 最近在研究Android项目,其中涉及到Android中解析Json数据的问题,需要模拟网络中传递Json数据的模式,因为以前是.net的工程师,所以想着从.net ...
- android应用程序fps meter[帧数显示]的分析 —— 浅谈root的风险 (1)
fps meter是常用的检测帧率的软件,该软件需要root权限才能工作,一直比较好奇它一个apk是如何知道系统当前的帧率情况的,就针对此apk分析了一下其工作原理. Apk组成 首先看一下apk的组 ...
- kubernetes service分析
service type k8s中service主要有三种: ClusterIP: use a cluster-internal IP only - this is the default and i ...
- 设计模式(二)单例模式Singleton(创建型)
几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销.再如大家最经常用的IM, ...
- input中的name,value以及label中的for
input具有很多属性,比较常用的有type,value,name,placeholder,multiple,checked等.对于其中的name.value.label相关以及标签外的文字,我一直是 ...
- windows下运行hadoop2.7.2
1.下载hadoop-2.7.2.tar.gz 2.解压到D:\hadoop\ 3.配置HADOOP_HOME环境变量 4.将%HADOOP_HOME%\bin目录添加到path环境变量中 5.配置J ...
- Url Rewrite IIS 配置
在configuration节点下 <system.webServer> <rewrite> <rules> <rule name="rD" ...
- java 的序列化
(1) 首先是java自己内部实现的对象序列化机制 其实就是ObjectInputStream 和 ObjectOutputStream 首先实现一个实体对象 记住必须实现Serializable ...
- Tomcat禁止外网访问
Tomcat中某个应用禁止外网访问 Tomcat中有多个应用,由于权限需要,将某一个主机禁止外网访问.在config/server.xml中设置: <Host name="172.16 ...