将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:11
  • 7425

将Excel数据快速大批量导入数据库的代码

两种途径将数据从EXCEL中导入到SQL SERVER。 一、        在程序中,用ADO.NET。代码 如下: //连接串 string strConn = "Provide...
  • han_cui
  • han_cui
  • 2017-04-13 16:09:56
  • 2976

<em>Excel</em>批量<em>导入Sql</em>

大数据量高效导入数据库(以<em>excel导入sqlserver</em>为例) <em>excel</em>文件(xls)批量<em>导入sqlserver</em>数据库 多种方法实现<em>Excel</em>批量导入数据库 Web页面中sqlserver<em>快速导入excel</em> ...
  • 2018年04月06日 00:00

Web页面中<em>sqlserver快速导入excel</em>

Web页面中<em>sqlserver快速导入excel</em>,生成csv格式有的程序在Web页<em>SQLSERVER导入excel</em>的过程中,会出现下载时找不到样式的错误提示。本资源避免了以上问题,快速打开,快速...
  • 2018年04月06日 00:00

delphi实现excel和SQLserver数据的导入导出

  • 2010年01月29日 15:15
  • 408KB
  • 下载

java使用POI将Excel文件中数据导入SqlServer中

  • 2013年07月16日 15:16
  • 13KB
  • 下载

利用 SqlbulkCopy 快速导入 Excel 数据至 SQLServer 数据库中

利用 SqlbulkCopy ,将Excel数据导入数据库,代码显得非常简单。更重要的是,导入速度之快、超出预期想像。本代码环境:VS2010、Excel2007、SqlServer 2008usin...
  • SlowCattle
  • SlowCattle
  • 2011-05-27 17:51:00
  • 636

如何高效的将excel导入sqlserver?

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

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

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

.net用excel导入sqlserver

  • 2010年07月29日 17:02
  • 111KB
  • 下载
收藏助手
不良信息举报
您举报文章:将excel快速导入sqlserver
举报原因:
原因补充:

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