当前位置:  编程技术>.net/c#/asp.net

使用sqlbulkcopy提高导入数据的性能的方法

    来源: 互联网  发布时间:2014-08-30

    本文导语:  向SQL Server中导入大量数量可以用bulk insert,但是必须要求插入的文件在数据库机器上或者一个数据库可以访问的共享文件夹中(我不知道怎么设置共享文件夹,以使得SQL Server能访问到)。 SqlBulkCopy 是.net中的一个类,提供了导...

向SQL Server中导入大量数量可以用bulk insert,但是必须要求插入的文件在数据库机器上或者一个数据库可以访问的共享文件夹中(我不知道怎么设置共享文件夹,以使得SQL Server能访问到)。

SqlBulkCopy 是.net中的一个类,提供了导入大量数据的功能。

基本用法如下:
 

代码如下:
using (SqlBulkCopy bc = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.UseInternalTransaction, null))
{
     bc.BulkCopyTimeout = 10 * 60;
     bc.BatchSize = 10000;
     bc.DestinationTableName = "dbo.Destination";
     bc.WriteToServer(reader); //reader 是一个继承自IDataReader的类的实例
}

可以自己写代码来实现继承自IDataReader的类。有n多成员要实现,比如FieldCount, Read(), GetValue(int i), Close()等。

读文件的例子:
 

代码如下:

//返回记录的列数
public int FieldCount 
{
     get { return 3; }
}

//读记录,此方法会被自动调用
public bool Read()
{
    if (_Reader == null)
    _Reader = new StreamReader(_FilePath);
    string line = _Reader.ReadLine();
    if (line != null)
    {
_CurrentQueryItem = GetRawData(line);
_Count++;

while (_CurrentQueryItem == null)//如果读出的是不满足条件的记录,则读下一条记录
{
    Read();
}
return true;
    }   
    return false;
}

//返回一条记录中第i 列(项)的值,此方法会被自动调用
//SqlBulkCopy内部应该有一个循环,从0到FieldCount -1 ,再调用GetValue(int i)这个方法。我猜的。。。
public object GetValue(int i)
{
    if (_CurrentQueryItem == null)
return null;

switch (i)
{
//如果数据库中表的第一列是自增字段,则会忽略第一列,也就是说此方法被调用时,i只会从1开始,所以不需要case 0的情况。估计.net内部去取目的表的schema,自动判断哪些列是需要从外部导入的。有空再研究这个问题
case 0:
    return _CurrentQueryItem.Item1;
case 1:
    return _CurrentQueryItem.Item2;
case 2:
    return _CurrentQueryItem.Item3;
default:
    throw new IndexOutOfRangeException();
    }
}

//释放资源
public void Close()
{
    Dispose();
}

public void Dispose()
{
    if (_Reader != null)
_Reader.Close();
}

有一些其他属性其方法需要自己实现,当然有的不实现也没关系。似乎重要的就以上几个方法了。
对照SqlDataRead,自己可以猜想出会用到哪些方法。

经过实验,一个文件如果一行一行插入到数据库里,需要大约2分钟,如果用SqlBulkCopy,则10秒左右就完成了。而且可以自己实现类来指定处理什么数据,也不用把文件放在数据库机器上了。
另外,SqlBulkCopy里用到的connction对象只能是SqlConnection。SqlBulkCopy.WriteToServer (DataRow]) 和SqlBulkCopy.WriteToServer (DataTable) 都是可以的。


    
 
 

您可能感兴趣的文章:

  • php导入excel php使用phpexcel导入excel文件
  • mysql使用SQLyog导入csv数据不成功的解决方法
  • 使用工具 plsqldev将Excel导入Oracle数据库
  • 自己编写的javabean ,可以用import导入使用么?
  • 使用mongovue把sqlserver数据导入mongodb的步骤
  • 使用php语句将数据库*.sql文件导入数据库
  • MySQL中使用load data命令实现数据导入的方法
  • jsp中使用jstl导入html乱码问题解决方法
  • oracle数据库导入导出命令使用方法
  • linux能想windows中那样,在dll中包含一个class,然后导入到exe中使用吗
  • 使用shell脚本进行命令导入的问题
  • BCP 大容量数据导入导出工具使用步骤
  • 使用navicat 8实现创建数据库和导入数据 管理用户与权限[图文方法]
  • 请教一下,进程调度时在导入新进程的cr3之后,CPU是怎么区分当前正处于内核而不去使用新的页目录呢?
  • 使用PHP导入与导出CSV文件实例详解
  • ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
  • Java 使用poi把数据库中数据导入Excel的解决方法
  • 使用BULK INSERT大批量导入数据 SQLSERVER
  • mysql导入sql文件命令和mysql远程登陆使用详解
  • 使用python将mdb数据库文件导入postgresql数据库示例
  • asp.net 使用SqlBulkCopy极速插入数据到 SQL Server
  • 使用SqlBulkCopy时应注意Sqlserver表中使用缺省值的列
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux系统下使用使用性能监视工具的前提?
  • 性能测试中应该用top命令统计cpu使用情况还是ps命令?
  • 请教各位:只安装TOMCAT而不搭配apache一起使用,在性能上有什么差别
  • ********************使用io复用好还是多线程的性能好?**************************
  • Mysql自带profiling性能分析工具使用分享
  • 强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
  • oracle 使用递归的性能提示测试对比
  • 【求助贴】数据库基准性能测试OSDL以及其工具的BDT系列的使用
  • mysql性能优化脚本mysqltuner.pl使用介绍
  • MySQL性能分析及explain的使用说明
  • 在Python中使用异步Socket编程性能测试
  • 在Nginx中使用X-Sendfile头提升PHP文件下载的性能(针对大文件下载)
  • 如何书写高质量jQuery代码(使用jquery性能问题)
  • MySQL索引背后的之使用策略及优化(高性能索引策略)
  • JAVA LinkedList和ArrayList的使用及性能分析
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    博客 iis7站长之家