将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. Candies POJ - 3159

    题目链接:https://vjudge.net/problem/POJ-3159 思路: 能看出是差分约束的题, 我们想假设一个人是 p(1),另一个人是p(2),他们之间糖果差为w, 那么需要满足的 ...

  2. DVWA的搭建

    DVWA的搭建 一.DVWA是什么? 一款渗透测试演练系统,俗称靶机. 二.如何搭建? Linux有成套的靶机,直接打开使用就可以,下面开始介绍Windows 下DVWA的搭建. 运行phpstudy ...

  3. Java多线程编程核心技术-第4章-Lock的使用-读书笔记

    第 4 章 Lock 的使用 本章主要内容 ReentrantLocal 类的使用. ReentrantReadWriteLock 类的使用. 4.1 使用 ReentrantLock 类 在 Jav ...

  4. VMware下安装Ubuntu虚拟机

    ubuntu系统是以桌面应用为主的.当下最火的linux操作系统,具有实用的界面,并且完全免费. 在Ubuntu的 Linux 世界里,已经不再只是简陋的界面+命令行,而是一款华丽时尚且无比实用的操作 ...

  5. sudo:有效用户 ID 不是 0,sudo 属于 root 并设置了 setuid 位吗?

    由于误操作导致无法使用sudo切换root用户 直接进入root用户并恢复文件权限,解决办法: chmod 4755 /usr/bin/sudo chmod  755 /usr/libexec/ses ...

  6. LIST OF BEST OPEN SOURCE BLOCKCHAIN PLATFORMS

    https://www.blockchain-council.org/blockchain/list-of-best-open-source-blockchain-platforms/ Open so ...

  7. java 监控文件夹 WatchService

    原文链接 :http://blog.csdn.net/lirx_tech/article/details/51425364 public class WacthFileUtil { public st ...

  8. python paramiko与linux的连接

    两种使用paramiko连接到linux服务器的代码 方式一: 1 ssh = paramiko.SSHClient() 2 ssh.set_missing_host_key_policy(param ...

  9. c# Aes加解密

    using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; ...

  10. 【AGC009E】Eternal Average

    [AGC009E]Eternal Average 题面 洛谷 题解 神仙题.jpg 我们把操作看成一棵\(k\)叉树,其中每个节点有权值,所有叶子节点(共\(n+m\)个)就是\(0\)或\(1\). ...