导读:在做项目的时候,当实现了动态建库后,需要实现从本地服务器上获取数据,批量导入到新建库的服务器中的一个表中去。之前是用了一个SQL脚本文件实现,但那时候没能实现不同的数据库服务器,现在用了SqlBulkCopy将其实现,现在说说具体过程。

一、SQLBulkCopy

1.1,概述

Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。 SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

我想了解更多关于SQLBulkCopy

1.2,属性

在本次实例中,用到了前三个属性。用于设置执行的批次数量,超时,和列映射定义。

二、具体实现

2.1,代码

<span style="font-family:KaiTi_GB2312;font-size:18px;">   /// <summary>
/// 向不同的数据库服务器中插入资源表数据 2012.12.27 20:40 何红霞
/// </summary>
/// <param name="data">需要导入的源数据</param>
/// <param name="db">目标服务器</param>
/// <param name="strTableName">目标表名</param>
/// <param name="strDataComlumName">列映射对应数组</param>
/// <returns>导入成功返回true,否则返回false</returns>
public bool InsertToTable(DataTable data, DataBaseViewModel db, string strTableName,string[] strDataComlumName)
{
try
{
//连接sql数据库语句
using (SqlConnection conn = new SqlConnection(db.Key))
{
if (conn.State != ConnectionState.Open)
conn.Open();
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn))
{
// 列映射集合。
for (int i = 0; i < strDataComlumName.Length; i++)
{
sqlBulkCopy.ColumnMappings.Add(i,strDataComlumName[i]);
}
// 每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。
sqlBulkCopy.BatchSize = data.Rows.Count; // 超时之前操作完成所允许的秒数。
sqlBulkCopy.BulkCopyTimeout = 60;
// 服务器上目标表的名称。
sqlBulkCopy.DestinationTableName = strTableName; // 将data这个datatable中的表复制到目标表中。
sqlBulkCopy.WriteToServer(data);
}
if (conn.State != ConnectionState.Closed)
conn.Close();
return true;
}
}
catch (Exception ex)
{ return false;
} }</span>

2.2,使用注意事项

1,在调用时,定义数组将表列名与数据源的列名一一对应起来。原因:sqlBulkCopy.ColumnMappings.Add(i,strDataComlumName[i]); 使用循环时,将列与列名限制了:i 对应的是列。

2,当插入数据中有默认值的话,需注意:假设源数据有A,B,C,D,E这几列,那么仅有最后一列为默认值时,可以只写入A,B,C,D。别的都不行,如果当B为默认值,而只导入了A,C,D,E,那么,就会发生:C—>B,D—>C,E—>D。

3,当把 SqlDateTime 类型的 DataTable 列批量加载到类型为 SQL Server 2008 中新增的日期/时间类型的 SQL Server 列时,SqlBulkCopy 将失败。

三、个人总结

虽然解决了当下的问题,那么其实新的问题又有了:问题1,如果是从多张表导入到一张表呢?问题2,如果是从一张表导入到多张表呢?问题3,如果是从不同的数据库类型进行导入呢?

还将继续研究。。。。。。。先总结到这儿。

【ITOO 1】SQLBulkCopy实现不同数据库服务器之间的批量导入的更多相关文章

  1. 通过自定义特性,使用EF6拦截器完成创建人、创建时间、更新人、更新时间的统一赋值(使用数据库服务器时间赋值,接上一篇)

    目录: 前言 设计(完成扩展) 实现效果 扩展设计方案 扩展后代码结构 集思广益(问题) 前言: 在上一篇文章我写了如何重建IDbCommandTreeInterceptor来实现创建人.创建时间.更 ...

  2. Web服务器与数据库服务器分离 导入 Excel数据至数据库

    一般情况一般项目WEB服务器与数据库均部署在一台服务器,文件上传,数据导入在一台服务器完成.web服务器与数据库服务器分离,文件上传与数据导入将分布在两台服务器或多台服务器之间.本案例为两台服务器,具 ...

  3. DPA/Ignite由于DNS问题导致连接不上被监控的数据库服务器

    问题描述: 在DPA(Ignite)的管理监控界面发现有两台SQL Server数据库服务器连接不上,截图如下所示,检查其日志内容 具体错误日志如下所示, Notice:日志里面具体的服务器名称被我用 ...

  4. 如何在 SSAS服务器之间做同步

    简介: 从SQL Server 2005开始,分析服务就支持了同步的功能.本文将介绍如何在SQL Server 2012下同步Adventureworks的分析服务数据库.通过同步的功能,我们就来可以 ...

  5. 多Web服务器之间共享Session的解决方案

    一.提出问题: 为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务 ...

  6. 跨服务器之间的session共享

    跨服务器之间的Session共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举4种较为可行的方案进行对比探讨: 1. 基于NFS的Session共享 NFS是Net FileSystem的简称 ...

  7. C/S架构程序多种类服务器之间实现单点登录(转)

    (一) 在项目开发的过程中,经常会出现这样的情况:我们的产品包括很多,以QQ举例,如登陆.好友下载.群下载.网络硬盘.QQ游戏.QQ音乐等,总不能要求用户每次输入用户名.密码吧,为解决这个问题,高手提 ...

  8. SQL Server 之 在数据库之间进行数据导入导出

    1.同一服务器上数据库之间进行数据导入导出 (1).使用 SELECT INTO 导出数据 在SQL Server中使用最广泛的就是通过SELECT INTO语句导出数据,SELECT INTO语句同 ...

  9. 多台web服务器之间共享session

    常见的几种方法如下: 1. 写客户端Cookie的方式 当用户登陆成功以后,把网站域名.用户名.密码.token.session有效时间全部采用cookie的形式写入到客户端的cookie里面,如果用 ...

随机推荐

  1. yum卸载遇到的问题--待解决

    系统版本是 [root@master ~]# uname -a Linux master -.el6.x86_64 # SMP Sun Nov :: EST x86_64 x86_64 x86_64 ...

  2. Keepalived+Nginx实现Nginx的高可用

    集群规划 主机名 IP VIP Nginx:port KeepAlived主备 KA_NG_01 192.168.30.130 192.168.30.120 8088 MASTER KA_NG_02 ...

  3. jQuery选择器之表单元素选择器

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...

  4. cnbeta新闻资讯第三方客户端应用

    该源码案例是一个cnbeta第三方客户端应用案例,作者ywwxhz,源码cnBeta-reader,cnbeta 的 Android 客户端项目. 源码下载: http://code.662p.com ...

  5. HDU 4281 (状态压缩+背包+MTSP)

    Judges' response Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. 写的一个HttpClient类

    package com.ca.test.cainterface.common.util.http; import com.ca.test.cainterface.common.util.data.Da ...

  7. DROP DOMAIN - 删除一个用户定义的域

    SYNOPSIS DROP DOMAIN name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP DOMAIN 将从系统表中删除一个用户域. 只 ...

  8. Hadoop伪集群部署

    环境准备 [root@jiagoushi ~]# yum -y install lrzsz 已加载插件:fastestmirror Repository 'saltstack-repo': Error ...

  9. 数据库_11_1~10总结回顾+奇怪的NULL

    校对集问题: 比较规则:_bin,_cs,_ci利用排序(order by) 另外两种登录方式: 奇怪的NULL: NULL的特殊性:

  10. CentOS6 自己动手搭建开放NTP服务器

    第一步: 1. 安装NTP服务程序: [root@host ~]# rpm -qa | grep ntp #查询是否安装ntp服务程序 [root@host ~]# yum install -y nt ...