我是靠谱客的博主 包容小笼包,最近开发中收集的这篇文章主要介绍c#中高效的excel导入sqlserver的方…,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

热门标签等功能上线啦         CSDN博客第二期云计算最佳博主评选        

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

分类: .Net开发 SQLServer 2008-07-14 19:43 14346人阅读 评论(19) 收藏 举报
sqlserver excel c# string dataset object

将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
{
    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://blog.csdn.net/jinjazz/archive/2008/05/13/2441635.aspx

===================================================

--SQL SERVER 和EXCEL的数据导入导出
--1、在SQL SERVER里查询Excel数据:
-- ======================================================
SELECT 
FROM  OpenDataSource(  'Microsoft.Jet.OLEDB.4.0' ,
'Data Source="c:book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0' )...[Sheet1$]
--下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。
SELECT 
FROM  OpenDataSource  'Microsoft.Jet.OLEDB.4.0' ,
   'Data Source="c:Financeaccount.xls";User ID=Admin;Password=;Extended properties=Excel 5.0' )...xactions
-------------------------------------------------------------------------------------------------
 
--2、将Excel的数据导入SQL server :
-- ======================================================
SELECT  into  newtable
FROM  OpenDataSource(  'Microsoft.Jet.OLEDB.4.0' ,
   'Data Source="c:book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0' )...[Sheet1$]
实例:
SELECT  into  newtable
FROM  OpenDataSource(  'Microsoft.Jet.OLEDB.4.0' ,
   'Data Source="c:Financeaccount.xls";User ID=Admin;Password=;Extended properties=Excel 5.0' )...xactions
-------------------------------------------------------------------------------------------------
 
--3、将SQL SERVER中查询到的数据导成一个Excel文件
-- ======================================================
--T-SQL代码:
EXEC  master..xp_cmdshell  'bcp 库名.dbo.表名out c:Temp.xls -c -q -S"servername" -U"sa" -P""'
--参数:S 是SQL服务器名;U是用户;P是密码
--说明:还可以导出文本文件等多种格式
实例: EXEC  master..xp_cmdshell  'bcp saletesttmp.dbo.CusAccount out c:temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
EXEC  master..xp_cmdshell  'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C: authors.xls -c -Sservername -Usa -Ppassword'
--在VB6中应用ADO导出EXCEL文件代码: 
--Dim cn  As New ADODB.Connection
--cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"
--cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:DT.xls -c -Sservername -Usa -Ppassword'"
------------------------------------------------------------------------------------------------
 
--4、在SQL SERVER里往Excel插入数据:
-- ======================================================
insert  into  OpenDataSource(  'Microsoft.Jet.OLEDB.4.0' ,
'Data Source="c:Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0' )...table1 (A1,A2,A3)  values  (1,2,3)
 
--T-SQL代码:
INSERT  INTO   
OPENDATASOURCE( 'Microsoft.JET.OLEDB.4.0'  
'Extended Properties=Excel 8.0;Data source=C:traininginventur.xls' )...[Filiale1$]  
(bestand, produkt)  VALUES  (20,  'Test'  

最后

以上就是包容小笼包为你收集整理的c#中高效的excel导入sqlserver的方…的全部内容,希望文章能够帮你解决c#中高效的excel导入sqlserver的方…所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部