首先创建一个数据库连接类: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. hdu 1507

    求能出售多少个1*2的矩形,,将原图染色,(i+j)%2==0的染白色,其余为黑色, 求白色跟黑色的最大匹配 #include<stdio.h> #include<string.h& ...

  2. MongoDB自学笔记1----1.1 NoSQL是什么?

    第一章 走进MongoDB 1.1NoSQL是什么?       1.1.1NoSQL简介        对于不了解NoSQL的人都会认为NoSQL为No SQL,即不是SQL.但是这种理解是错误的, ...

  3. Visual Studio属性配置中使用宏

    在学习C语言的时候,我们曾经遇到过一个宏的概念.宏的作用机理本质上是宏的展开,C语言中的宏的用法也有很多种(水其实很深...),不过从感觉上来讲,人们大致上会在以下的场景中,利用宏来解决一些窘境:一是 ...

  4. Js 使用new关键字调用函数和直接调用函数的区别

    最近开始学习js,在看到书上的一个例子时,引发了我的一系列思考: 书上例子: function Person(name,age,job){ var o =new Object(); o.name=na ...

  5. win7无声音显示“未插入扬声器或耳机” 怎么解决

    不知道是否有用户朋友跟本人遇到这么一个情况,电脑不论是不是有插上耳机或者扬声器,在机箱前面和后面的耳机插孔处都试了好几遍,win8纯净版系统依旧没有声音. 这时候我们来看一下桌面右下角音量图标显示一个 ...

  6. 线段树练习 3&&P3372 【模板】线段树 1

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  7. python绝技 — 侦听802.11 Probe请求

    代码 #!/usr/bin/python #--*--coding=utf-8--*-- from scapy.all import * interface = 'wlan1' probeReqs = ...

  8. List去重

    因为用到list,要去除重复数据,尝试了几种方法.记录于此... 测试数据: List<string> li1 = new List<string> { "8&quo ...

  9. [SQL基础教程] 4-1 数据的插入(INSERT)

    [SQL基础教程] C4 数据更新 4-1 数据的插入(INSERT) INSERT INSERT INTO <表名>(列1,列2...) VALUES(值1,值2...); 清单 用() ...

  10. Oracle常用查询

    -- 创建Oracle sequence create sequence SEQ_XXHF minvalue 1 maxvalue 9999999999999999999999999999 start ...