将excel快速导入sqlserver

原创 2009年03月07日 19:42:00

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

 

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

本文资料整理来自:CSDN

大数据量高效导入数据库(以excel导入sqlserver为例)

最近正在做一个项目,要把excel中的数据导入到sqlserver数据库中,首先想到的就是insert,采用连接Excel对象的Microsoft.ACE.OLEDB.12.0接口引擎连接到excel...
  • u014180504
  • u014180504
  • 2015年09月21日 21:25
  • 5805

Excel表格数据导入到SQLServer数据库

数据挖掘课上,老师说我们最后考察是以课程论文的形式给出,用SQLServer分析数据。 数据挖掘用的是Clement软件,结课写论文还要用SQLServer分析数据,我们分析的数据肯定不会少,是...
  • GarfieldEr007
  • GarfieldEr007
  • 2017年03月26日 22:27
  • 368

大数据量高效导入数据库(以excel导入sqlserver为例)

首先想到的就是insert,采用连接Excel对象的Microsoft.ACE.OLEDB.12.0接口引擎连接到excel,然后读取到DataTable中然后每次读取一个Row,insert到数据库...
  • haojiani00
  • haojiani00
  • 2015年10月17日 12:41
  • 1001

将Excel上传到服务器,读取Excel数据写入到数据库

使用LinqToExcel.dll 1、上传Excel文件到服务器上 HttpPostedFileBase mypostfile = Request.Files[0]; ...
  • tiz198183
  • tiz198183
  • 2013年04月09日 17:52
  • 1728

JAVA Excel数据批量导入到SQL数据库

今天刚好需要批量将Excel里的数据导入到SQL Server,本来打算用Genero写的,发现官方驱动包找不到SQL Server 2012的驱动,我的天啊,无解!只好用JAVA来写!JAVA通过加...
  • ERP_TOP_DD
  • ERP_TOP_DD
  • 2016年03月30日 16:48
  • 5619

将Excel数据导入到SqlServer及导入时数据类型转换失败解决方案

将数据导入到SqlServer是很常用的一个功能,而Excel数据源又是数据导入功能的常用数据源,在使用时遇到一些问题,记录下来防止大家走弯路。...
  • xiaouncle
  • xiaouncle
  • 2016年10月13日 11:03
  • 4751

c#如何实现excel导入到sqlserver,如何实现从sqlserver导出到excel中(详细)

对于从sqlserver中导入、导出excel,虽然sqlserver已经给了较为简单的方式,通过交互式的对话框形式实现,但是有时这种方式存在的很多问题,比方说导入、导出数据不全。而且,对于一个项目而...
  • ztzi321
  • ztzi321
  • 2015年03月13日 15:46
  • 2942

【SQL Server技巧篇】如何使用Transact-SQL脚本语言导入Excel表

由于公司不向普通员工开放自有系统后台数据库的接入,但有时需要处理庞大数据量或输出特殊分析报表,这时候如果用Excel就比较卡顿了,处理时间长,报表也不一定能一步到位做出来。遇到这种情况,小屌我喜欢把E...
  • yang_hua_shu
  • yang_hua_shu
  • 2015年05月22日 19:11
  • 740

C#将Excel数据表导入SQL数据库的两种方法

方法一: 实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data....
  • ryong1267
  • ryong1267
  • 2016年04月04日 21:33
  • 769

Sql 脚本导入EXCEL数据

Sql 脚本导入EXCEL数据 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHigh...
  • wozengcong
  • wozengcong
  • 2014年08月29日 09:51
  • 2357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:将excel快速导入sqlserver
举报原因:
原因补充:

(最多只允许输入30个字)