将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的Vb程序代码

  • 2012年08月09日 11:29
  • 531KB
  • 下载

将excel文档的数据导入sqlserver数据表

这是我的excel文档: 这是数据库表: 1.在sqlserver中的项目中右击-任务-导入数据;如图: 2:如图: 3: 4: 5...

如何利用SQL查询语句从SQLSERVER数据库中导入导出EXCEL表格

如何利用SQL查询语句从SQLSERVER数据库中导入导出EXCEL表格   平常从SQLSERVER中进行导入导出时,我们利用SQLSERVER中自带的DTS转换工具即可,很方便。但有些特殊...

SQLServer与excel和txt的导入导出

exec sp_configure 'show advanced options',1 --启用高级配置选项设置 reconfigure; exec sp_configure 'Ad Hoc Dist...

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

黄聪:c#中高效的excel导入sqlserver的方法 将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办...
  • anlun
  • anlun
  • 2015年02月02日 09:11
  • 333

关于Excel导入SQLServer的说明

近来需要做个将Excel数据导入到SQLServer表中的小程序,查找了一下,解决方法如下: 一、自己编程手动读取Excel文件内容(可采用OLE操作),然后使用SQL语句插入SQLServer目标...

SQLServer导入导出excel及常见问题

前几天考试系统导入导出学生信息,初次接触导入导出,为sqlserver和excel的数据传递方法之简和MS产品的高效兼容所震惊,但也遇到各种各样问题,在此介绍SQLServer导入导出excel方法及...

excel数据导入sqlserver

要用T-SQL语句直接导出至Excel工作薄,就不得不用借用SQL Server管理器的一个扩展存储过程:xp_cmdshell,此过程的作用为“以操作系统命令行解释器的方式执行给定的命令字符串,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:将excel快速导入sqlserver
举报原因:
原因补充:

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