好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

[计算机]c中高效的excel导入sqlserver的方法.doc

3页
  • 卖家[上传人]:tian****1990
  • 文档编号:71743122
  • 上传时间:2019-01-21
  • 文档格式:DOC
  • 文档大小:66.68KB
  • / 3 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • c#中高效的excel导入sqlserver的方法时间:2010-02-26 15:15:53来源:网络 作者:未知 点击:343次将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现不但速度快,而且代码简单,下面测试代码将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现不但速度快,而且代码简单,下面测试代码导入一个6万多条数据的sheet,包括读取(全部读?冉下┰谖业目⒒肪持兄恍枰?0秒左右,而真正的导入过程只需要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相同的效果了。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.