首先创建一个数据库连接类: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数据库表中的更多相关文章

  1. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  2. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  3. C#批量插入数据到Sqlserver中的三种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...

  4. C#_批量插入数据到Sqlserver中的四种方式

    先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...

  5. C# 之 批量插入数据到 SQLServer 中

    创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如 ...

  6. C#批量插入数据到Sqlserver中的四种方式 - 转

    先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...

  7. 【转载】C#批量插入数据到Sqlserver中的三种方式

    引用:https://m.jb51.net/show/99543 这篇文章主要为大家详细介绍了C#批量插入数据到Sqlserver中的三种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本篇, ...

  8. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

  9. SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

    原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...

随机推荐

  1. 这几天有django和python做了一个多用户博客系统(可选择模板)

    这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...

  2. DDNS client on a Linux machine

    Using this tool -> inadyn apt-get install inadyn -y Usage: https://github.com/troglobit/inadyn#ex ...

  3. jQuery动态操作表单

    <html> <head> <title>jquery表格操作</title> <script language="javascript ...

  4. 谷歌、flick网站图片 一次性下载 javaWeb项目 多线程下载,

    源码下载:http://download.csdn.net/detail/liangrui1988/5760473

  5. 64win7+64Oracle+32plsql

    1)安装Oracle 11g 64位   2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0) 下载instantclient-basic- ...

  6. C/C++ 内存对齐

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  7. 解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND

    原文:http://kikoroc.com/2016/05/04/resolve-hexo-DTraceProviderBindings-MODULE-NOT-FOUND.html 今晚折腾hexo的 ...

  8. Arrays类——Arrays.asList()方法使用

    java.util类 Arrays java.lang.Object——java.util.Arrays public class Arrays extends Object 此类包含用来操作数组(比 ...

  9. 结构-行为-样式-Javascript 深度克隆函数(转)

    突然想到有一回面试的时候有一个问题一直挂在心头,于是乎在网上找了找,这个比较好: //深度克隆 function deepClone(obj) { var result, oClass = isCla ...

  10. phpwamp单身狗模式的详解与分析,单身狗模式/即霸体模式的作用讲解。

    最近有学生在使用PHPWAMP的时候,问我霸体模式的作用. 学生问:老师,PHPWAMP里面的霸体模式是什么意思,有什么用? 回答:额...就是以前我发布测试版的时候,模式切换里面的单身狗模式. 学生 ...