C# SqlBulkCopy类批量导入 测试
一、功能说明
1、可以选择,只导入部分列,或者导入全部列。
2、导入速度的确比一般sql要快。
3、不用写sql语句
---------------------------------------------------------
4、导入数据库 须 将字段对应关系做好配置,否则很有可能导入数据库的数据,字段顺序问题出错。
----------------------------------------------------------------------------------------
二、C#导入代码
/// <summary>
///
/// </summary>
/// <param name="connectionString">目标连接字符</param>
/// <param name="TableName">目标表</param>
/// <param name="dt">源数据</param>
private void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dt)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlBulkCopy sqlbulkcopy =new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
sqlbulkcopy.DestinationTableName = TableName;
for (int i = ; i < dt.Columns.Count; i++)
{
sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
sqlbulkcopy.WriteToServer(dt);
}
catch (System.Exception ex)
{
throw ex;
}
}
}
}
三、测试
3.1 数据库建表
CREATE TABLE temp
(
test1 varchar(30),
test2 varchar(30),
test3 varchar(30),
test4 varchar(30),
test5 varchar(30),
test6 varchar(30)
)
3.2 C# 代码,测试 DataTabe比数据库表少一个字段,执行插入数据库也少做一个对应关系。
private void button1_Click(object sender, EventArgs e)
{
SqlBulkCopyByDatatable(dt);
} private void Form1_Load(object sender, EventArgs e)
{
/*
* 这里 test1 字段不添加字段,待会看执行Copy 会出错
*/
dt = new DataTable();
dt.Columns.Add("test2", System.Type.GetType("System.String"));
dt.Columns.Add("test3", System.Type.GetType("System.String"));
dt.Columns.Add("test4", System.Type.GetType("System.String"));
dt.Columns.Add("test5", System.Type.GetType("System.String"));
dt.Columns.Add("test6", System.Type.GetType("System.String"));
//添加行数据
for (int i = ; i < ; i++)
{
DataRow dr = dt.NewRow();
dr["test2"] = "test2";
dr["test3"] = "test3";
dr["test4"] = "test4";
dr["test5"] = "test5";
dr["test6"] = "test6";
dt.Rows.Add(dr);
}
this.dataGridView1.DataSource = dt;
} /// <summary>
///
/// </summary>
/// <param name="connectionString">目标连接字符</param>
/// <param name="TableName">目标表</param>
/// <param name="dt">源数据</param>
private void SqlBulkCopyByDatatable(DataTable dt)
{
using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;"))
{
using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
sqlbulkcopy.DestinationTableName = "temp";
for (int i = ; i < dt.Columns.Count; i++)
{
sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
sqlbulkcopy.WriteToServer(dt);
}
catch (System.Exception ex)
{
throw ex;
}
}
}
}
执行结果无异常。

3.3 数据库表中 的“test1” 列 DataTable 没有,DataTable 中“test7” 数据库没有,对应关系 只关联双方共有的列。
private void button1_Click(object sender, EventArgs e)
{
SqlBulkCopyByDatatable(dt);
} private void Form1_Load(object sender, EventArgs e)
{
/*
* 这里 test1 字段不添加字段,待会看执行Copy 会出错
* 新增 test7 列 ,数据库中没有 ‘test7’ 这一列
*/
dt = new DataTable();
dt.Columns.Add("test2", System.Type.GetType("System.String"));
dt.Columns.Add("test3", System.Type.GetType("System.String"));
dt.Columns.Add("test4", System.Type.GetType("System.String"));
dt.Columns.Add("test5", System.Type.GetType("System.String"));
dt.Columns.Add("test6", System.Type.GetType("System.String"));
dt.Columns.Add("test7", System.Type.GetType("System.String"));
//添加行数据
for (int i = ; i < ; i++)
{
DataRow dr = dt.NewRow();
dr["test2"] = "test2";
dr["test3"] = "test3";
dr["test4"] = "test4";
dr["test5"] = "test5";
dr["test6"] = "test6";
dr["test7"] = "test7";
dt.Rows.Add(dr);
}
this.dataGridView1.DataSource = dt;
} /// <summary>
///
/// </summary>
/// <param name="connectionString">目标连接字符</param>
/// <param name="TableName">目标表</param>
/// <param name="dt">源数据</param>
private void SqlBulkCopyByDatatable(DataTable dt)
{
using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;"))
{
using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
/*
* 字段对应关系绑定,只绑定双方共有的。
*/
sqlbulkcopy.DestinationTableName = "temp";
sqlbulkcopy.ColumnMappings.Add("test2", "test2");
sqlbulkcopy.ColumnMappings.Add("test3", "test3");
sqlbulkcopy.ColumnMappings.Add("test4", "test4");
sqlbulkcopy.ColumnMappings.Add("test5", "test5");
sqlbulkcopy.ColumnMappings.Add("test6", "test6");
//for (int i = 0; i < dt.Columns.Count; i++)
//{
// sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
//}
sqlbulkcopy.WriteToServer(dt);
}
catch (System.Exception ex)
{
throw ex;
}
}
}
}
sql数据库插入数据 正常,C#代码没有报错:

3.4 打乱Datatable 列的顺序,不添加字段对应关系,数据库中导入数据错位。
private void button1_Click(object sender, EventArgs e)
{
SqlBulkCopyByDatatable(dt);
} private void Form1_Load(object sender, EventArgs e)
{
/*
* 这里 test1 字段不添加字段,待会看执行Copy 会出错
* 新增 test7 列 ,数据库中没有 ‘test7’ 这一列
* 打乱 每一列的对应关系
*/
dt = new DataTable();
dt.Columns.Add("test5", System.Type.GetType("System.String"));
dt.Columns.Add("test6", System.Type.GetType("System.String"));
dt.Columns.Add("test7", System.Type.GetType("System.String"));
dt.Columns.Add("test2", System.Type.GetType("System.String"));
dt.Columns.Add("test3", System.Type.GetType("System.String"));
dt.Columns.Add("test4", System.Type.GetType("System.String"));
//添加行数据
for (int i = ; i < ; i++)
{
DataRow dr = dt.NewRow();
dr["test5"] = "test5";
dr["test6"] = "test6";
dr["test7"] = "test7";
dr["test2"] = "test2";
dr["test3"] = "test3";
dr["test4"] = "test4";
dt.Rows.Add(dr);
}
this.dataGridView1.DataSource = dt;
} /// <summary>
///
/// </summary>
/// <param name="connectionString">目标连接字符</param>
/// <param name="TableName">目标表</param>
/// <param name="dt">源数据</param>
private void SqlBulkCopyByDatatable(DataTable dt)
{
using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;"))
{
using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
/*
* 字段对应关系绑定,只绑定双方共有的。
*/
sqlbulkcopy.DestinationTableName = "temp";
//sqlbulkcopy.ColumnMappings.Add("test2", "test2");
//sqlbulkcopy.ColumnMappings.Add("test3", "test3");
//sqlbulkcopy.ColumnMappings.Add("test4", "test4");
//sqlbulkcopy.ColumnMappings.Add("test5", "test5");
//sqlbulkcopy.ColumnMappings.Add("test6", "test6");
//for (int i = 0; i < dt.Columns.Count; i++)
//{
// sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
//}
sqlbulkcopy.WriteToServer(dt);
}
catch (System.Exception ex)
{
throw ex;
}
}
}
}
数据正常导入数据库,但是存在数据问题,顺序错乱。

C# SqlBulkCopy类批量导入 测试的更多相关文章
- C# SqlBulkCopy类批量导入数据
特别注意 sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...
- 关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的
最近在做数据从Excel批量导入MSSQL时,传统的是使用Insert Into Table方法,不过这个方便比较慢 通过使用 SqlBulkCopy 可以批量导入到数据库. 默认批量导入数据库,需要 ...
- C# 使用SqlBulkCopy类批量复制大数据
用途说明: 前些日子,公司要求做一个数据导入程序,要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储.于是在网上进行查找,发现了一个比较好的解决方案,就是采用S ...
- 用.net中的SqlBulkCopy类批量复制数据 (转载)
在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...
- 使用asp.net 2.0中的SqlBulkCopy类批量复制数据
介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个Sq ...
- 使用SqlBulkCopy类实现导入excel表格
前言: 上篇博客介绍了SqlBulkCopy类批量操作数据库的相关操作,最后提到了可以使用这个类实现excel文件导入数据库,接下来我做简单介绍. 首先说一下思路: 把excel中的数据读出来并放入到 ...
- C# 使用 SqlBulkCopy 类批量复制数据到数据库
最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类 ...
- .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库
批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...
- 使用SqlBulkCopy类批量复制大数据
using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using Syst ...
随机推荐
- Web前端JQuery面试题(三)
Web前端JQuery面试题(三) 1.怎么阻止冒泡过程? stopPropagation(); // 阻止冒泡过程 2.ready()方法和onload()方法的区别? onload()方法要等页面 ...
- Kali学习笔记20:缓冲区溢出实验环境准备
在前几篇的博客中:我介绍了OpenVAS和Nessus这两个强大的自动化漏洞扫描器 但是,在计算机领域中有种叫做0day漏洞:没有公开只掌握在某些人手中 那么,这些0day漏洞是如何被发现的呢? 接下 ...
- Kubernetes---DaemonSet
DaemonSet用于管理在集群中每个Node上仅运行一份Pod的副本实例. kind: DaemonSet
- Spring Boot 最核心的 3 个注解详解
最近面试一些 Java 开发者,他们其中有些在公司实际用过 Spring Boot, 有些是自己兴趣爱好在业余自己学习过.然而,当我问他们 Spring Boot 最核心的 3 个注解是什么,令我失望 ...
- pytorch bug: for step,data in enumerate(loader)+Connection reset by peer
单GPU跑的程序,而且是在docker中,迭代了几百步后,程序突然崩掉了, 程序停在了 for step,data in enumerate(loader),下面是部分bug信息 Traceback ...
- Python编程Day7——字符编码、字符与字节、文件操作
一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...
- 我可能不懂Array.prototype.sort
今天 fix 我们后台系统的一些 bug.系统是基于 beego 和模板开发的,各种前后端代码揉作一团,没有格式,没有 eslint,全局变量满天飞,连 js 代码都有后端的插值,读起来非常 酸爽. ...
- java jar 后台运行
nohup java -jar $APP_NAME.jar >/dev/null &
- Node.js 使用 RSA 做加密
RSA RSA加密算法是一种非对称加密算法. 假设 A 与 B 通信.A 和 B 都提供一个公开的公钥.A 把需要传递的信息,先用自己的私钥签名,再用 B 的公钥加密.B 接收到这串密文后,用自己的私 ...
- angular框架下的跨域问题(获取天气数据)
1.新浪天气:http://php.weather.sina.com.cn/iframe/index/w_cl.php?code=js&day=0&city=&dfc=1&am ...