如何高效的将excel导入sqlserver

大部分人都知道用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相同的效果了。

本文资料整理来自:CSDN

时间: 2024-11-02 04:27:15

如何高效的将excel导入sqlserver的相关文章

请教EXCEL导入sqlserver数据库

问题描述 现在我可以将EXCEL导入到数据库里面去(单表操作)但是现在需求是要做成通用的就是在页面上选择表名(或者从EXCEL文件里面获取到表明)就将数据导入到那张表里去像这样的多表操作我就没了思路请各位指导!!! 解决方案 解决方案二:都差不多.只是中间多了一个创建表的过程.将表名,表的字段,类型都取出来,创建表.然后放入数据库解决方案三:求解啊!!!解决方案四:都差不多.只是中间多了一个创建表的过程.将表名,表的字段,类型都取出来,创建表.然后放入数据库解决方案五:每次得到的Excel还有插

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

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

Excel导入Sqlserver数据库脚本_MsSql

受以前旧同事之托,在博客里发这段脚本: exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure SELECT * INTO tmp_asset FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=d:\Excel数据源\资产印章.xls', 'SE

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

如何高效的将excel导入到oracle?和前两天的SqlBulkCopy 导入到sqlserver对应,oracle也有自身的方法,只是稍微复杂些. 那就是使用oracle的sql*loader功能,而sqlldr只支持类似csv格式的数据,所以要自己把excel转换一下. 实现步骤: 用com组件读取excel-保存为csv格式-处理最后一个字段为null的情况和表头-根据excel结构建表-生成sqlldr的控制文件-用sqlldr命令导入数据 这个性能虽然没有sql的bcp快,但还是相当

EXCEL导入sql 用C#体现?

问题描述 表结构建立好后,以下是SQL代码?我想能够用excel导入到sqlServer后显示以下代码返回的所有行在导出到excel?代码该如何写,本人新手@.@感谢!SQL-代码selectname,workshop,sum(integral)frombirthdaywherefdate>='2014-07-01'groupbyworkshop,namehavingsum(integral)>=50orderbyworkshop,name; 解决方案 解决方案二:如果就这需求,根本就不用借助

将excel高效导入sqlserver的可行方法_实用技巧

大部分人都知道用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.

(C#)excel数据导入SqlServer中

excel|server|sqlserver|数据 编写程序,把附件的EXCEL文件( (实验题附件1)03级学生名单.xls或(实验题附件2)成绩登记表.xls) 导入到SQL SERVER2000数据库中.要求:1.EXCEL文件作为数据源2.根据EXCEL文件的字段在SQL SERVER中建立对应的字段3.把EXECL中的记录导到SQL SERVER中 string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =

图片- excel数据 导入sqlserver出现的问题,相应的列我设置的是nvarchar(max)

问题描述 excel数据 导入sqlserver出现的问题,相应的列我设置的是nvarchar(max) 解决方案 请问题是什么问题呀?我看了表格中的字数多是多,但是不会过超过navarchar(max)吧,话说navarchar(max)在excel中一个单元格中可以写多少个字呀? 解决方案二: 请问题是什么问题呀?我看了表格中的字数多是多,但是不会过超过navarchar(max)吧,话说navarchar(max)在excel中一个单元格中可以写多少个字呀?

求批量插入和更新Excel导入数据高效解决方法~

问题描述 需求:导入Excel(上万条记录),每一行数据对应表(table_product)的一条记录. 导入时先读取Excel,并将数据insert到table_product表,同时insert到记录表,当barcode存在则做update操作.(barcode是Excel中的某一列的值).现有的处理方式很脑残:Action处理: List<String[]> list = new ArrayList<String[]>(); Map<Integer, String[]&