【C#常用方法】3.将DataTable一次性插入数据库表中(使用SqlBulkCopy)
将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)的更多相关文章
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号?
Oracle 语句中“||”代表什么啊? oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号? 排序的话,用order by来处理即可.比如:cola123a234b999b335s ...
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- c++获取sqlite3数据库表中所有字段的方法
常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 方法1:使用s ...
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
- Excel表数据导入数据库表中
***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为 ...
- oracle 把查询结果插入到表中几种方式
转载:Oracle中把一个查询结果插入到一张表中 以下是信息留存: 一.Oracle数据库中,把一张表的查询结果直接生成并导入一张新表中. 例如:现有只有A表,查询A表,并且把结果导入B表中.使用如下 ...
- MySQL 两个数据库表中合并数据
两个数据库表中合并数据 如果有 t1 和 t2 两个数据库表格,它们两个对应的字段是相同的.如何将 t2 的数据插入到t1中去呢? insert into t1 select * from t2 ...
- 在oracle数据库表中没有添加rowid字段为什么会出现?
rowid 是 oracle 数据库表中的伪列, rowid 首先是一种数据类型,它唯一标识一条记录物理位置, 基于64位编码的18个字符显示.因为 rowid 是伪列, 所以并未真的存储在表中,但可 ...
随机推荐
- Linux系统运行模式介绍
Linux运行模式 自由服务,即不需要用户独立去安装的软件服务,而是在系统安装好之后就可以直接使用的服务(内置服务). 运行模式也称为运行级别,属于linux的自有服务. 运行模式可以理解为一旦你开机 ...
- Nginx 高级配置--关于favicon.ico
Nginx 高级配置--关于favicon.ico 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.浏览器会默认帮咱们访问官网的图标 1>.浏览器访问网站"htt ...
- 为 Jupyter 添加目录
1.依次在 anaconda prompt 窗口中执行以下两句命令 pip install jupyter_contrib_nbextensions # 安装第三方包 jupyter contrib ...
- python 和 R 语言 中的 range() 函数
1.python 中的 range() 函数生成整数序列,常用于 for 循环的迭代. 示例: 2.R 语言中的 range() 函数返回一个数值向量中的最小值和最大中,常用于求极差. 示例: 按语: ...
- HDU3507:Print Article(斜率优化dp)
传送门 题意: 现有\(n\)个数,每个数的值为\(a_i\),现在可以把数划分为多段,每一段的代价为\((\sum_{k=i}^{j}c_i)^2+M\). 问怎么划分,代价最小. 思路: 考虑dp ...
- Mybatis JdbcType与Oracle、MySql数据类型对
Mybatis JdbcType Oracle MySql JdbcType ARRAY JdbcType BIGINT BIGINT JdbcType BINARY JdbcTy ...
- 06-cmake语法-include
用来载入CMakeLists.txt文件,也用于载入预定义的cmake模块. include(cmake/OpenCVMinDepVersions.cmake) .cmake 是一个文本,定义了一个模 ...
- Ql004(母牛的故事)
一,看题目 1,这个虽然我不想说,但是我确实不会,但是我的意思是你可以不会但是不能每次都不会那咋办? 二,看题解 1,你得大概知道这个东西是考啥的(虽然这个东西提前给你说了是d递归),但是考试肯定没人 ...
- cube.js 最近的一些更新
cube.js 是一个和不错的数据分析框架,最近又有了一些新的功能支持,以下是一些简单的 总结 基于web socket 的预览支持 react hooks api 支持 支持基于reecharts ...
- 第二章python中的一切皆对象
1.函数和类也是对象,属于python的一等公民 赋值给一个变量 可以添加到集合对象之中 可以作为参数传递给函数 可以当作函数的返回值 def ask(name="ask_wzh" ...