博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何高效的将excel导入sqlserver
阅读量:4965 次
发布时间:2019-06-12

本文共 3355 字,大约阅读时间需要 11 分钟。

原文地址:

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

using System;using System.Data;using System.Windows.Forms;using System.Data.OleDb;namespace WindowsApplication2{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            //测试,将excel中的sheet1导入到sqlserver中            string connString = "server=localhost;uid=sa;pwd=sqlgis;database=master";            System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();            if (fd.ShowDialog() == DialogResult.OK)            {                TransferData(fd.FileName, "sheet1", connString);            }        }        public void TransferData(string excelFile, string sheetName, string connectionString)        {            DataSet ds = new DataSet();            try            {                //获取全部数据                string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";                OleDbConnection conn = new OleDbConnection(strConn);                conn.Open();                string strExcel = "";                OleDbDataAdapter myCommand = null;                strExcel = string.Format("select * from [{0}$]", sheetName);                myCommand = new OleDbDataAdapter(strExcel, strConn);                myCommand.Fill(ds, sheetName);                //如果目标表不存在则创建                string strSql = string.Format("if object_id('{0}') is null create table {0}(", sheetName);                foreach (System.Data.DataColumn c in ds.Tables[0].Columns)                {                    strSql += string.Format("[{0}] varchar(255),", c.ColumnName);                }                strSql = strSql.Trim(',') + ")";                using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))                {                    sqlconn.Open();                    System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();                    command.CommandText = strSql;                    command.ExecuteNonQuery();                    sqlconn.Close();                }                //用bcp导入数据                using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))                {                    bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);                    bcp.BatchSize = 100;//每次传输的行数                    bcp.NotifyAfter = 100;//进度提示的行数                    bcp.DestinationTableName = sheetName;//目标表                    bcp.WriteToServer(ds.Tables[0]);                }            }            catch (Exception ex)            {                System.Windows.Forms.MessageBox.Show(ex.Message);            }        }        //进度显示        void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)        {            this.Text = e.RowsCopied.ToString();            this.Update();        }    }}

 

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

转载于:https://www.cnblogs.com/aji88/archive/2010/08/19/1803678.html

你可能感兴趣的文章
js 基础拓展
查看>>
C#生成随机数
查看>>
Android应用程序与SurfaceFlinger服务的连接过程分析
查看>>
Java回顾之多线程
查看>>
机电行业如何进行信息化建设
查看>>
9、总线
查看>>
Git 笔记 - section 1
查看>>
2018 Multi-University Training Contest 10 - TeaTree
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6203 ping ping ping
查看>>
《人人都是产品经理》书籍目录
查看>>
如何在git bash中运行mysql
查看>>
OO第三阶段总结
查看>>
构建之法阅读笔记02
查看>>
DataTable和 DataRow的 区别与联系
查看>>
检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败
查看>>
mysql数据库中数据类型
查看>>
Fireworks基本使用
查看>>
两台电脑间的消息传输
查看>>
Linux 标准 I/O 库
查看>>