博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLBulkCopy使用实例--读取Excel写入数据库/将 Excel 文件转成 DataTable
阅读量:6802 次
发布时间:2019-06-26

本文共 5277 字,大约阅读时间需要 17 分钟。

MS SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表可以在不同服务器上)。

SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。相比其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句), SqlBulkCopy 提供明显的性能优势。(经测试数据量越大性能越明显,至少是批量insert语句的25倍以上。)

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是数据源不限于 SQL Server,可以使用任何数据源,只要数据可加载到 实例或可使用 实例读取数据。

SqlBulkcopy对象主要作为作为了提高批量插入的效率,所以在默认情况下批量数据的插入并不会引发insert触发器的触发。这可以通过使用指定enum SqlBulkCopyOptionsFireTriggers解决。读取Excel写入数据库/将 Excel 文件转成 DataTable

注意:使用SqlBulkcopy时在inserted表中是有多条记录的,且一次调用SqlBulkcopy只会有一次触发器的运行。

 

 

 

实例--读取Excel写入数据库/将 Excel 文件转成 DataTable  

源代码:

#region 读取Excel        ///         /// 将 Excel 文件转成 DataTable 后,再把 DataTable中的数据写入表Products        ///         ///         ///         /// 
public static int WriteExcelToDataBase(string excelFileName) { int rowsCount = 0; OleDbConnection objConn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFileName+ ";" + "Extended Properties=Excel 8.0;"); objConn.Open(); try { DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); string sheetName = string.Empty; for (int j = 0; j < schemaTable.Rows.Count; j++) { sheetName = schemaTable.Rows[j][2].ToString().Trim();//获取 Excel 的表名,默认值是sheet1 DataTable excelDataTable = DbHelperSQL.ExcelToDataTable(excelFileName, sheetName, true); if (excelDataTable.Columns.Count > 1) {   SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction); sqlbulkcopy.DestinationTableName = "Products";//数据库中的表名 sqlbulkcopy.WriteToServer(excelDataTable); sqlbulkcopy.Close(); } } } catch (SqlException ex) { throw ex; } finally { objConn.Close(); objConn.Dispose(); } return rowsCount; } /// /// 读取Excel /// /// /// ///
public static DataSet ExcelToDS(string Path, string sheetName) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;"; //HDR=Yes; DataSet ds = null; using (OleDbConnection conn = new OleDbConnection(strConn)) { OleDbDataAdapter myCommand = null; try { conn.Open(); string strExcel = ""; strExcel = "select * from [" + sheetName + "$]"; myCommand = new OleDbDataAdapter(strExcel, strConn); ds = new DataSet(); myCommand.Fill(ds, "table1"); } catch (SqlException ex) { throw ex; } finally { myCommand.Dispose(); conn.Close(); } return ds; } } /// /// 将 Excel 文件转成 DataTable /// /// Excel文件及其路径 /// 工作表名,如:Sheet1 /// True 第一行是标题,False 第一行是数据 ///
DataTable
public static DataTable ExcelToDataTable(string serverMapPathExcel, string strSheetName, bool isTitleOrDataOfFirstRow) { string HDR = string.Empty;//如果第一行是数据而不是标题的话, 应该写: "HDR=No;" if (isTitleOrDataOfFirstRow) { HDR = "YES";//第一行是标题 } else { HDR = "NO";//第一行是数据 } //源的定义 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + serverMapPathExcel + ";" + "Extended Properties='Excel 8.0;HDR=" + HDR + ";IMEX=1';"; //Sql语句 //string strExcel = string.Format("select * from [{0}$]", strSheetName); 这是一种方法 string strExcel = "select * from [" + strSheetName + "]"; //定义存放的数据表 DataSet ds = new DataSet(); //连接数据源 using (OleDbConnection conn = new OleDbConnection(strConn)) { try { conn.Open(); //适配到数据源 OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn); adapter.Fill(ds, strSheetName); } catch (System.Data.SqlClient.SqlException ex) { throw ex; } finally { conn.Close(); conn.Dispose(); } } return ds.Tables[strSheetName]; } #endregion

      使用SqlBulkCopy类进行数据插入其原理是采用了SQL Server的BCP协议进行数据的批量复制。通常 我们先要建好一个DataTable(最好是通过DataAdapter来灌数据得到,因为这样出来的DataTable就已经有跟数据表相同的列定义, 可以免去之后Mapping Column的步骤),把要插入的数据加进这个DataTable中,然后用SqlBulkCopy的实例来插入到数据库中。经过测 试,SqlBulkCopy方法比直接用Sql语句插入数据的效率高出将近25倍。

 

转载于:https://www.cnblogs.com/kingsony/p/3373365.html

你可能感兴趣的文章
教师节有“假期” 网络电话传递温情祝福
查看>>
中天携手协鑫集成共拓光伏市场
查看>>
云存储与视频监控协力合作 平安城市再提速
查看>>
Windows环境搭建Web自动化测试框架Watir
查看>>
再等两年 英特尔能否重回摩尔定律?
查看>>
智慧城市建设 这五个方面不可不考虑
查看>>
Qt之镜像旋转
查看>>
《Cinema 4D + After Effects动态图形设计案例解析》——第 1 章 动态图形设计概述 1.1 什么是动态图形...
查看>>
WordPress REST API 内容注入/权限提升漏洞
查看>>
深圳网站建设公司|网站文章不收录的四大决定性因素|卓炎科技
查看>>
《实施Cisco统一通信管理器(CIPT1)》一第2章 部署模型
查看>>
《SolidWorks 2013中文版完全自学手册》——2.4 尺寸标注
查看>>
《Adobe Photoshop CS4中文版经典教程》—第1课1.4节在Photoshop中还原操作
查看>>
《IPv6精髓(第2版)》——3.8 链路本地地址和站点本地地址
查看>>
《深入浅出iPhone/iPad开发(第2版)》——使用GUI编辑器连接UI控制到代码
查看>>
【秒懂设计模式】总述及工厂模式
查看>>
《数据科学:R语言实现》——3.10 重塑数据
查看>>
《抓住听众心理——演讲者要知道的100件事》一16.时间是相对的
查看>>
运维前线:一线运维专家的运维方法、技巧与实践1.8 运维自动化依赖的团队模型...
查看>>
《树莓派渗透测试实战》——第1章 树莓派和Kali Linux基础知识
查看>>