大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了。很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,System.Data.SqlClient.SqlBulkCopy 对于新手来说还是比较陌生的,这个就是传说中效率极高的bcp,6万多数据从excel导入到sql只需要4.5秒。

  1. using System;
  2. using System.Data;
  3. using System.Windows.Forms;
  4. using System.Data.OleDb;
  5. namespace WindowsApplication2
  6. {
  7. public partial class Form1 : Form
  8. {
  9. public Form1()
  10. {
  11. InitializeComponent();
  12. }
  13. private void button1_Click(object sender, EventArgs e)
  14. {
  15. //测试,将excel中的sheet1导入到sqlserver中
  16. string connString = "server=localhost;uid=sa;pwd=sqlgis;database=master";
  17. System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();
  18. if (fd.ShowDialog() == DialogResult.OK)
  19. {
  20. TransferData(fd.FileName, "sheet1", connString);
  21. }
  22. }
  23. public void TransferData(string excelFile, string sheetName, string connectionString)
  24. {
  25. DataSet ds = new DataSet();
  26. try
  27. {
  28. //获取全部数据
  29. string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
  30. OleDbConnection conn = new OleDbConnection(strConn);
  31. conn.Open();
  32. string strExcel = "";
  33. OleDbDataAdapter myCommand = null;
  34. strExcel = string.Format("select * from [{0}$]", sheetName);
  35. myCommand = new OleDbDataAdapter(strExcel, strConn);
  36. myCommand.Fill(ds, sheetName);
  37. //如果目标表不存在则创建
  38. string strSql = string.Format("if object_id('{0}') is null create table {0}(", sheetName);
  39. foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
  40. {
  41. strSql += string.Format("[{0}] varchar(255),", c.ColumnName);
  42. }
  43. strSql = strSql.Trim(',') + ")";
  44. using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
  45. {
  46. sqlconn.Open();
  47. System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
  48. command.CommandText = strSql;
  49. command.ExecuteNonQuery();
  50. sqlconn.Close();
  51. }
  52. //用bcp导入数据
  53. using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
  54. {
  55. bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
  56. bcp.BatchSize = 100;//每次传输的行数
  57. bcp.NotifyAfter = 100;//进度提示的行数
  58. bcp.DestinationTableName = sheetName;//目标表
  59. bcp.WriteToServer(ds.Tables[0]);
  60. }
  61. }
  62. catch (Exception ex)
  63. {
  64. System.Windows.Forms.MessageBox.Show(ex.Message);
  65. }
  66. }
  67. //进度显示
  68. void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
  69. {
  70. this.Text = e.RowsCopied.ToString();
  71. this.Update();
  72. }
  73. }
  74. }

上面的TransferData基本可以直接使用,如果要考虑周全的话,可以用oledb来获取excel的表结构,并且加入ColumnMappings来设置对照字段,这样效果就完全可以做到和sqlserver的dts相同的效果了。

如何高效的将excel导入sqlserver?的更多相关文章

  1. (转)高效的将excel导入sqlserver中

    大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了.很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,System.Data.SqlClie ...

  2. excel 导入 sqlserver 字符串被截取为255长度解决方案

    excel表格导入sqlserver数据表中 内容被截取为255长度的字符串. 注意:excel是通过前8行(表头的首行除外)的数据类型来判断导入数据的数据格式的,例如前8行出现整数型,那么默认就用整 ...

  3. c#中高效的excel导入sqlserver的方法

    将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.S ...

  4. Silverlight将Excel导入到SQLserver数据库

    最近纠结于读取Excel模板数据,将数据导入SQLServer的Silverlight实现,本文将实现代码贴出,作为一个简单的例子,方便各位: 1.先设计前台界面新建Silverlight5.0应用程 ...

  5. Excel与SqlServer的导入导出问题总结

    1.Excel导入到SqlServer中,如果Excel里面的某一列,即有文本,又有数字,导入SqlServer中这一列的类型将会是float,Excel里面对应的文本值将导不进来,为null. 解决 ...

  6. c++ 读写Excel及数据导入SQLServer

    c++ 读写Excel及数据导入SQLServer                 C++操作Excel ,网上的资料还是比较多的,写这篇文章也是分享给初学者一些经验. 本人 觉得CSpreadShe ...

  7. C# 获取excel架构并的导入sqlserver的方法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. 个人永久性免费-Excel催化剂功能第21波-Excel与Sqlserver零门槛交互-执行SQL语句篇

    在前两波中,已完成了Excel与Sqlserver的查询和上传功能,但难免许多临时的或更深入地操作数据库需要用Sql语句来操作,对一般用户电脑里,不可能有条件轻易安装一个数据库客户端软件,就算安装了对 ...

  9. [原创]Net实现Excel导入导出到数据库(附源码)

    关于数据库导出到Excel和SQLServer数据导出到Excel的例子,在博客园有很多的例子,自己根据网上搜集资料,自己做了亦歌简单的demo,现在分享出来供初学者学习交流使用. 一.数据库导入导出 ...

随机推荐

  1. JavaScript中变量、作用域、内存问题

    这几天,闲的没事看看JavaScript高级编程,感觉JavaScript真的很强大,尤其是采用面向对象的编程方式. 一.   基本类型和引用类型的值: ECMAScript变量可能包含两种不同数据类 ...

  2. 【WPF】淡入淡出切换页面

    <NavigationWindow x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsof ...

  3. 编译PHP并与Ngnix整合

    nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理进程处理,fascgi管 ...

  4. Android之 广播

    (以下内容是阅读郭霖大神的<第一行代码>后自己总结的) 1.概述 广播是Android的四大组件之一. Android的广播机制十分灵活. 2.发送广播 如上图Android的广播主要分为 ...

  5. apue第17章笔记

    unix domain socket 关闭socket并不会删除文件,重复bind会失败.所以在bind之前要unlink该文件. open服务器的实现只是简单地看了一下,大致上就是通过unix do ...

  6. ARP监测工具Arpwatch

    ARP监测工具Arpwatch   ARP协议是网络的基础协议.基于ARP协议的ARP攻击是局域网最为常见和有效的攻击方式.ARP攻击可以通过发送伪造的ARP包实施欺骗,实现各种中间人攻击.Arpwa ...

  7. 洗牌问题 FZU - 1062 (传说中的思路题,hhh)

    设2n张牌分别标记为1, 2, -, n, n+1, -, 2n,初始时这2n张牌按其标号从小到大排列.经一次洗牌后,原来的排列顺序变成n+1, 1, n+2, 2, -, 2n, n.即前n张牌被放 ...

  8. 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 830  Solved: 338 Description ...

  9. 【UOJ #110】【APIO 2015】Bali Sculptures

    http://uoj.ac/problem/110 这道题subtask4和subtask5是不同的算法. 主要思想都是从高位到低位贪心确定答案. 对于subtask4,n比较小,设\(f(i,j)\ ...

  10. Mybatis 删除多条数据XML SQL语句删除

    Mybatis 删除多条数据XML SQL语句删除 1.删除多条数据SQL写法 <delete id="deleteParamsByIds"> delete from ...