当前位置: 首页 > news >正文

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

将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

相关文章:

  • DeepGLO
  • 《梦断代码》上市
  • Multi-Horizon Time Series Forecasting with Temporal Attention Learning
  • 网络互联设备之区别详解
  • Quantile RNN
  • 正式开始homeR的计划
  • 非线性状态空间模型与非线性自回归模型的联系
  • matplotlib 颜色名称表
  • 分布式缓存BeIT Memcached简介
  • 【pytorch】时间序列预测 —— 同时预测多个分位点
  • 关于Oracle 顽固的KILLED 状态的SESSION的处理
  • 科技论文的写作逻辑
  • C#中字符串操作函数
  • BibTex 的使用
  • C# 运算符
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • CentOS7 安装JDK
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • es6(二):字符串的扩展
  • JAVA并发编程--1.基础概念
  • Shell编程
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 技术发展面试
  • 精彩代码 vue.js
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 什么软件可以剪辑音乐?
  • AI算硅基生命吗,为什么?
  • 函数计算新功能-----支持C#函数
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ###C语言程序设计-----C语言学习(6)#
  • #HarmonyOS:Web组件的使用
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (003)SlickEdit Unity的补全
  • (arch)linux 转换文件编码格式
  • (ZT)出版业改革:该死的死,该生的生
  • (力扣题库)跳跃游戏II(c++)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原)Matlab的svmtrain和svmclassify
  • .apk文件,IIS不支持下载解决
  • .dwp和.webpart的区别
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CLR基本术语
  • .NET Core 2.1路线图
  • .NET 发展历程
  • .NET使用存储过程实现对数据库的增删改查
  • @ModelAttribute使用详解
  • @PreAuthorize注解
  • @Query中countQuery的介绍
  • [145] 二叉树的后序遍历 js
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [2016.7.Test1] T1 三进制异或
  • [20170728]oracle保留字.txt
  • [android] 天气app布局练习
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)