一、功能说明

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类批量导入 测试的更多相关文章

  1. C# SqlBulkCopy类批量导入数据

    特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...

  2. 关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的

    最近在做数据从Excel批量导入MSSQL时,传统的是使用Insert Into Table方法,不过这个方便比较慢 通过使用 SqlBulkCopy 可以批量导入到数据库. 默认批量导入数据库,需要 ...

  3. C# 使用SqlBulkCopy类批量复制大数据

    用途说明: 前些日子,公司要求做一个数据导入程序,要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储.于是在网上进行查找,发现了一个比较好的解决方案,就是采用S ...

  4. 用.net中的SqlBulkCopy类批量复制数据 (转载)

    在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...

  5. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个Sq ...

  6. 使用SqlBulkCopy类实现导入excel表格

    前言: 上篇博客介绍了SqlBulkCopy类批量操作数据库的相关操作,最后提到了可以使用这个类实现excel文件导入数据库,接下来我做简单介绍. 首先说一下思路: 把excel中的数据读出来并放入到 ...

  7. C# 使用 SqlBulkCopy 类批量复制数据到数据库

    最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类 ...

  8. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  9. 使用SqlBulkCopy类批量复制大数据

    using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using Syst ...

随机推荐

  1. Java进程和线程关系及区别

    1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基 ...

  2. Javascript高级编程学习笔记(31)—— BOM(5)screen、history对象

    screen对象 screen对象应该是BOM对象中最不常用的对象了 其主要用于提供客户端的显示能力信息 包括浏览器外部显示的信息,和像素的宽高等 这个对象的主要用于检测客户端能力,一般不会影响功能 ...

  3. Android优化指南

    Android系统中GC内存泄漏的原因 主动回收内存System.gc();.getruntime.runtime.gc 导致内存泄漏主要的原因是,申请了内存空间而忘记了释放.如果程序中存在对无用对象 ...

  4. SQL 将查询结果插入到另一张表中

    INSERT INTO (1) 如果两张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表 WHERE 条件; ...

  5. Eclipse 使用前常用设置

    1.常用设置的位置 Eclipse中一般的设置都是在这个位置进行设置的: 2.设置字体类型和大小 一般可以设置成这样代码比较清晰:Consolas + 常规 + 小四 3.设置各种编码 设置工作空间的 ...

  6. [Postman]捕获HTTP请求(14)

    如果您使用API​​构建客户端应用程序 - 移动应用程序,网站或桌面应用程序 - 您可能希望查看应用程序中发送和接收的实际HTTP请求流量.在某些情况下,您可能会发现甚至没有记录的API.Postma ...

  7. Spring Boot - 获取所有的Bean信息

    前言 Spring Boot启动的时候需要加载许多Bean实现最小化配置,本文将尝试找出Spring启动后加载的所有Bean信息: 通过ApplicationContext 去获取所有的Bean 通过 ...

  8. python中执行该文件,就调用 mian 方法

    代码: test.py import student def main(): st = student.student(1001, 'tommy', 18) st.sing() st.dance() ...

  9. Linux常用命令之压缩和解压缩命令

    目录 1.压缩解压缩格式 .gz 一.将文件压缩为 .gz 格式,只能压缩文件:gzip 二.将 .gz 文件解压:gunzip 2.压缩解压缩格式 .tar.gz 一.将文件或目录压缩为 .tar. ...

  10. TensorFlow中的Placement启发式算法模块——Placer

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 受限于单个Device的计算能力和存储大小,许多深度学习模型都有着使用模型分片 ...