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

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

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

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

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

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

源代码:

#region 读取Excel

        /// <summary>
/// 将 Excel 文件转成 DataTable 后,再把 DataTable中的数据写入表Products
/// </summary>
/// <param name="serverMapPathExcelAndFileName"></param>
/// <param name="excelFileRid"></param>
/// <returns></returns>
public static int WriteExcelToDataBase(string excelFileName)
{
int rowsCount = ;
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 = ; j < schemaTable.Rows.Count; j++)
{
sheetName = schemaTable.Rows[j][].ToString().Trim();//获取 Excel 的表名,默认值是sheet1
DataTable excelDataTable = DbHelperSQL.ExcelToDataTable(excelFileName, sheetName, true);
if (excelDataTable.Columns.Count > )
{
  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; } /// <summary>
/// 读取Excel
/// </summary>
/// <param name="Path"></param>
/// <param name="tableName"></param>
/// <returns></returns>
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;
}
} /// <summary>
/// 将 Excel 文件转成 DataTable
/// </summary>
/// <param name="serverMapPathExcel">Excel文件及其路径</param>
/// <param name="strSheetName">工作表名,如:Sheet1</param>
/// <param name="isTitleOrDataOfFirstRow">True 第一行是标题,False 第一行是数据</param>
/// <returns>DataTable</returns>
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倍。

SQLBulkCopy使用实例--读取Excel写入数据库/将 Excel 文件转成 DataTable的更多相关文章

  1. C#中创建、打开、读取、写入、保存Excel的一般性代码

    ---转载:http://hi.baidu.com/zhaocbo/item/e840bcf941932d15fe358228 1. Excel对象微软的Excel对象模型包括了128个不同的对象,从 ...

  2. python读取与写入csv,txt格式文件

    python读取与写入csv,txt格式文件 在数据分析中经常需要从csv格式的文件中存取数据以及将数据写书到csv文件中.将csv文件中的数据直接读取为dict类型和DataFrame是非常方便也很 ...

  3. C#连接Excel读取与写入数据库SQL ( 下 )

    接上期 dataset简而言之可以理解为 虚拟的 数据库或是Excel文件.而dataset里的datatable 可以理解为数据库中的table活着Excel里的sheet(Excel里面不是可以新 ...

  4. jxl读取excel实现导入excel写入数据库

    @RequestMapping(params = "method=import", method = RequestMethod.POST) @ResponseBody publi ...

  5. 通过POI实现上传EXCEL的批量读取数据写入数据库

    最近公司新增功能要求导入excel,并读取其中数据批量写入数据库.于是就开始了这个事情,之前的文章,记录了上传文件,本篇记录如何通过POI读取excel数据并封装为对象上传. 上代码: 1.首先这是一 ...

  6. Java读取、写入、处理Excel文件中的数据(转载)

    原文链接 在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Java读写Ex ...

  7. .net读取Excel转datatable、.net读取的Excel存在合并单元格并且转成datatable

    项目中经常会遇到Excel导入数据,Excel的模板会可能是存在合并单元格的,模板如下图所示 读取时需要填充合并单元格的值,转成datatable单元格值时,填充合并单元格的值,如下图所示: 合并单元 ...

  8. Delphi读取和写入utf-8编码格式的文件

    读取UTF-8格式的文件内容 function LoadUTF8File(AFileName: string): string; var ffileStream:TFileStream; fAnsiB ...

  9. C#连接Excel读取与写入数据库SQL ( 上 )

    第一次写C#与sql的东西,主要任务是从Excel读取数据,再存到SQL server中. 先上读取Excel文件的code如下. public bool GetFiles(string equipN ...

随机推荐

  1. Spring IOC/DI- 3 different types

    理论: IOC(Inversion of Control控制反转) DI(依赖注入) (Dependency Injection)   它不是一种技术而是一种思想.当初IOC理论的提出就是为了解决对象 ...

  2. jQuery 表格删除,添加行

    var colsNum = 4; 1,$(document),ready(function () { $.("#id1").parent().after('<tr class ...

  3. 自定义UI集成微信、QQ、微博分享功能

    目前社会化分享是一个非常常见的功能,通过阅读官方文档可以进行对应平台的分享.在项目中原本有微信的分享,后来需要集成QQ和微博的分享,于是想着用ShareSDK,在使用的过程中发现ShareSDK中的w ...

  4. 在checkbox中使用.prop; angular中属性的值使用变量问题

    1.在checkbox中使用.prop而不使用.attr ,.attr有时并不如愿的改变checkbox的打钩问题 给这个checkbox设置return  false就能阻止点击则改变状态的默认行为 ...

  5. SPSS数据分析—加权最小二乘法

    标准的线性回归模型的假设之一是因变量方差齐性,即因变量或残差的方差不随自身预测值或其他自变量的值变化而变化.但是有时候,这种情况会被违反,称为异方差性,比如因变量为储蓄额,自变量为家庭收入,显然高收入 ...

  6. 比较ID和Name

    早期的HTML使用name(名称)属性来标示每个元素,但考虑到名称会存在重复性,所以从HTML4版本开始W3C就不再使用name属性,而是使用ID作为元素的唯一标识符,但在某一反面依旧使用,如常用的: ...

  7. 使用script创建标签添加属性值和添加样式

    <mark>使用script创建标签和给标签属性值以及样式的方法</mark><script> window.onload=function(){ var btn= ...

  8. Hprose question

    1 在服务端 接口的开发中 如果定义了index()方法 中间不能够有参数,否则报错. 2 接口方法中的参数 最好使用单参数 如fun($uid ) 或者 如果需要多个参数 fun($param){$ ...

  9. Jmeter性能测试入门(链接收藏)

    Jmeter性能测试入门: http://www.cnblogs.com/TankXiao/p/4045439.html

  10. Python:函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 定义和调用 >>> def add(x,y): ... print('x=',x) #Python3必须加&quo ...