大部分人都知道用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. bzoj 1856 卡特兰数

    复习了一下卡特兰数.. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #d ...

  2. SQL Join简单介绍

    前沿 Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接.外联接和交叉联接等. 如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时 ...

  3. PHP获取客户端请求头信息

    获取HTTP请求头信息 Apache 如果web服务器用的是apache,可以直接用php的库函数getallheaders() Nginx 如果web服务器用的是nginx,则无法直接使用getal ...

  4. Git gitconfig 配置

    difftool: [diff] tool = bc4 algorithm = histogram [difftool] prompt = false [difftool "bc4" ...

  5. 【JAVAWEB学习笔记】19_事务概述、操作、特性和隔离级别

    事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...

  6. braft初探

    接上一篇<brpc初探>. 什么是RAFT 看内部一个开源项目的时候,一开始我以为他们自己实现了raft协议.但是看了代码之后,发现用的是braft.因为在我们自己bg里一直在提paxos ...

  7. linux下如何配置TCP参数设置详解

    设置tcp参数一定要小心谨慎,轻易不要更改线上环境,我贴一下我们线上环境中,sysctl.conf的内容,见文章底部 net.ipv4.tcp_tw_reuse    = 1  net.ipv4.tc ...

  8. React Native 系列(九)

    前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...

  9. 51nod1394 差和问题 值域线段树

    水题..... 插入一个值$v$时,对于$[0, v - 1]$和$[v + 1, inf]$的点分别考虑就行了 删除相当于减去插入的贡献 用动态开点线段树卡点常数就过去了 复杂度$O(n \log ...

  10. [CODE FESTIVAL 2018]Sushi Restaurant

    题意:有$n$个人,对每个人,他有$p_i$的概率饥饿值为$x_i$($1\leq i\leq m$),你现在要做$n$盘寿司,每盘寿司有一定的数量,当这$n$个人的饥饿值确定后他们会自己选择最优的( ...