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

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现。不但速度快,而且代码简单,下面测试代码导入一个6万多条数据的sheet,包括读取(全部读取比较慢)在我的开发环境中只需要10秒左右,而真正的导入过程只需要4.5秒。

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;

namespace WindowsApplication2
{
/* 何问起 hovertree.com */
    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相同的效果了。

获取excel结构的方法可以参考我先前的文章 http://www.cnblogs.com/roucheng/p/csoledb.html

推荐:http://www.cnblogs.com/roucheng/p/excelhanshu.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120334.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 双拼输入法快速入门

    双拼输入法快速入门转自少数派https://sspai.com/post/32809,作者@大唐废猫本文适合并仅适合以下人群观看:喜爱折腾熟练使用盲打对汉语拼音有敏感度对于输入速度有要求愿意慢慢看完这一大篇文章并坚持痛苦使用为什么要批判全拼输入?自从计算机发明之后,如何利用QWERTY键盘输入汉字便成为一大难题,在历经五笔、注音、双拼、手写等各类输入角逐后,全拼…

    2022年6月18日
    49
  • Eclipse SVN插件的帐号、password改动

    Eclipse SVN插件的帐号、password改动

    2021年12月2日
    48
  • MySql修改表名的两种方法

    MySql修改表名的两种方法一、renamerenametable旧表名to新表名;renametablemysutonew_su;二、alteraltertable旧表名rename[as]新表名altertablemysurenameasnew_su;

    2022年6月1日
    2.2K
  • 2g内存能用的安卓模拟器_逍遥模拟器卡顿怎么解决

    2g内存能用的安卓模拟器_逍遥模拟器卡顿怎么解决现在安卓模拟器作为安卓文件在电脑上运行的辅助工具,使用率非常高,不过有一些用户表示自己的电脑配置比较低,使用一些较为热门的模拟器可能会比较卡,不好用,那么下面小编就为大家推荐一番。安卓模拟器低配置版哪个好1、叶子猪手游模拟器叶子猪手游模拟器资源下载版本名称下载地址叶子猪模拟器官方最新版叶子猪手游模拟器下载首先我们将来说说叶子猪手游模拟器,相信喜欢玩游戏的小伙伴都知道,它稳定兼容99%以上硬件…

    2022年4月19日
    213
  • pycharm添加pip指令安装库的方法[通俗易懂]

    pycharm添加pip指令安装库的方法[通俗易懂]我们在cmd命令窗口通过pip指令安装的python第三方库,在使用pycharm的时候并不能直接使用,需要通过配置与python3.8的外部库相连接。1.file–>setting2.project–>ProjectInterpreter选择python.exe的路径,一般在python3.x文件夹下3.添加python.exe的路径如果没有类似python3.8/python.exe的选项,就点击右侧的设置按钮添加然后点击OK就会出现如下通过pip指令安装的所有第三方库,

    2022年8月25日
    7
  • JBPM工作流的性能问题「建议收藏」

    JBPM工作流的性能问题「建议收藏」前言:我计划把我的blog从51cto移到javaeye,陆陆续续地把我对工作流的理解贴上来,和大家交流。我在项目中应用过jbpm工作流,总体而言,jbpm是诸多开源workflow中比较好的一个。他的面向图的设计比起那些一味宣称遵守所谓的WfMC规范的工作流好多了。在应用的过程中,我发现jbpm还是有不少问题,其中性能问题比较突出。主要表现为:1、任务分配的表设计不合理,如果…

    2025年10月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号