将DataTable一次性插入数据库表中(使用SqlBulkCopy)

1.SqlBulkCopy简介


  SqlBulkCopy类是ADO.NET中专门用于数据库批量插入数据的类,其批量插入的执行速度是其他类似操作类中最快的。SqlBulkCopy类在批量插入数据时,不用去像传统插入操作那样先拼写出sql语句再对sql语句进行执行,而是可以直接将一个DataTable插入数据库的目标表中。

  关于SqlBulkCopy类的用法详见下面例子2。

2.将DataTable一次性插入数据表中


(1)方法代码

  直接上功能代码,代码中的注释很详细:

    class DBHelper
{
/// <summary>
/// 使用sqlBulkCopy将DataTable一次性插入数据库
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="tableName">要插入的数据库表名称</param>
/// <param name="colMapping">DataTable与数据库表中列的对应关系,key:为DataTable的列名,value:数据库表的列名</param>
/// <returns></returns>
public static bool InsertDataTableToDB(DataTable dt, string tableName, Dictionary<string, string> colMapping)
{
try
{
string connStr = "Server=.;Database=TestDB;uid=sa;pwd=songge";//连接字符串 //使用SqlBulkCopy可省略SqlConnection,直接将连接字符串赋给它(当然也可以不省略),第二个参数表示打开事物(一步操作失败那么所有操作回滚)
using (SqlBulkCopy bc = new SqlBulkCopy(connStr, SqlBulkCopyOptions.UseInternalTransaction))
{
//添加DataTable每列与数据表每列的对应关系
foreach (var item in colMapping)
{
bc.ColumnMappings.Add(item.Key, item.Value);
}
bc.BatchSize = dt.Rows.Count;//设置每次插入的数据量
bc.DestinationTableName = tableName;//设置目标表(要插入到哪个数据库表)
bc.WriteToServer(dt);//执行插入
return true;
}
}
catch (Exception ex)
{
return false;
}
}
}

(2)使用方法

  首先在数据库新建一个测试表,名称为TestTable1,表结构如下所示:

  

  重点解释:将一个DataTable插入数据库时,如果设置了ColumnMappings(即设置了DataTable列与数据库表列的对应关系),那么在插入时只插入绑定了的列,如果不设置ColumnMappings,那么如果想用SqlBulkCopy将DataTable插入数据库,那么这个DataTable的结构必须与数据库表的结构相同(列名相同,好像顺序与列的数量也得相同,我没测试)。

        private void button_Click(object sender, RoutedEventArgs e)
{
//初始化一个要插入数据表的DataTable
DataTable dt = new DataTable();
dt.Columns.Add("a", typeof(string));
dt.Columns.Add("b", typeof(string));
dt.Columns.Add("c", typeof(int));
dt.Columns.Add("x", typeof(string));
dt.Columns.Add("Cc", typeof(string));
//设置与数据库表的对应关系,因为DataTable只绑定了数据库表的三列,所以在插入时,只插入绑定的这三列
Dictionary<string, string> colMapping = new Dictionary<string, string>();
colMapping.Add("c", "Cf");
colMapping.Add("b", "Ca");
colMapping.Add("a", "Cb");
//插入10条测试数据
for (int i=;i<;i++)
{
dt.Rows.Add(dt.NewRow().ItemArray = new object[] { "a", "b" , i, "x","Cc"});
} //执行方法
DBHelper.InsertDataTableToDB(dt, "TestTable1", colMapping);
}

  执行结果:

  

【C#常用方法】3.将DataTable一次性插入数据库表中(使用SqlBulkCopy)的更多相关文章

  1. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  2. oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号?

    Oracle 语句中“||”代表什么啊? oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号? 排序的话,用order by来处理即可.比如:cola123a234b999b335s ...

  3. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  4. c++获取sqlite3数据库表中所有字段的方法

    常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 方法1:使用s ...

  5. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  6. Excel表数据导入数据库表中

    ***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为 ...

  7. oracle 把查询结果插入到表中几种方式

    转载:Oracle中把一个查询结果插入到一张表中 以下是信息留存: 一.Oracle数据库中,把一张表的查询结果直接生成并导入一张新表中. 例如:现有只有A表,查询A表,并且把结果导入B表中.使用如下 ...

  8. MySQL 两个数据库表中合并数据

    两个数据库表中合并数据 如果有  t1  和 t2 两个数据库表格,它们两个对应的字段是相同的.如何将 t2 的数据插入到t1中去呢? insert into t1 select * from t2 ...

  9. 在oracle数据库表中没有添加rowid字段为什么会出现?

    rowid 是 oracle 数据库表中的伪列, rowid 首先是一种数据类型,它唯一标识一条记录物理位置, 基于64位编码的18个字符显示.因为 rowid 是伪列, 所以并未真的存储在表中,但可 ...

随机推荐

  1. Java数据类型(1)

    基本数据类型 A.整型 byte:(8位--1个字节 有符号 以二进制补码表示) 范围:-27~27-1 即 -128~127 short:(16位--2个字节 有符号 以二进制补码表示) 范围:-2 ...

  2. Python从零开始——解释器

  3. 【Tomcat】Web应用的目录结构

    创建时间:6.14 Web应用的目录结构 .xml文件不用自己写,抄头抄尾就可以 (别人的) (抄头抄尾) *注意:WEB-INF目录是受保护的,外界不能直接访问 如果访问WEB-INF目录下的htm ...

  4. 【JavaScript】内部与外部引入方式

    1.内部引入方式: script的type属性默认为"text/javascript",可以不写 <script type="text/javascript&quo ...

  5. PAT 乙级 1038.统计同成绩学生 C++/Java

    题目来源 本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即学生总人数.随后一行给出 N 名学生的百分制整数成绩,中间以空 ...

  6. Ubuntu配置samba服务器

    假设我的Ubuntu用户名:myname 1. 安装和卸载samba: sudo apt-get install samba samba-common sudo apt-get autoremove ...

  7. Make Rounddog Happy(2019年杭电多校第十场1011+HDU6701+启发式分治)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 求有多少个子区间满足\(a_l,a_{l+1},\dots,a_r\)均不相同且\(max(a_l,a_{l+1},\dots,a_r)-(r ...

  8. Winform----自定义控件之半透明遮罩(蒙版遮盖指定控件)

    先贴运行效果图,源码点击这里下载 1.新建自定义控件 2.实现功能   namespace UserControlLib   {   [ToolboxBitmap(typeof(ZhLoading)) ...

  9. flask实战-个人博客-电子邮件支持

    电子邮件支持 因为博客要支持评论,所以我们需要在文章有了新评论后发邮件通知管理员.而且,当管理员回复了读者的评论后,也需要发送邮件提醒读者. 为了方便读者使用示例程序,personalBlog中仍然使 ...

  10. 微信小程序中的事件

    事件 说明 bindtap bindload 当图片载入完毕时触发,event.detail = {height, width} bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒 ...