批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储。
采用SqlBulkCopy来处理存储数据。SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储到数据库中,而不需要一次一次的向数据库Insert数据。
经过几次实验,百万级别的数据表,也只需几秒时间内就可以完全的存入数据库中,其速度,比传统的Insert into方法不止快很多倍。
下面看代码:
/// <summary> /// 批量插入数据 /// </summary> /// <param name="connectionString">连接数据库字符串</param> /// <param name="tableName">表名称</param> /// <param name="dt">需要批量插入数据库DataTable数据源</param> /// <param name="bulkCopyTimeout">连接数据库的溢出时间</param> /// <returns></returns> public static bool SqlBulkCopyByDatatable(string connectionString, string tableName, DataTable dt, int bulkCopyTimeout = 120) { try { using (SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction)) { sqlbulkCopy.DestinationTableName = tableName; sqlbulkCopy.BulkCopyTimeout = bulkCopyTimeout; for (int i = 0; i < dt.Columns.Count; i++) { sqlbulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); } sqlbulkCopy.WriteToServer(dt); sqlbulkCopy.Close();//关闭连接 return true; } } catch (System.Exception ex) { throw ex; } } /// <summary> /// 批量插入数据 /// </summary> /// <param name="connectionString">连接数据库字符串</param> /// <param name="tableName">表名称</param> /// <param name="dt">需要批量插入数据库DataTable数据源</param> /// <param name="batchSize">一次批量插入多少条数据</param> /// <param name="bulkCopyTimeout">连接数据库的溢出时间</param> /// <returns></returns> public static bool SqlBulkCopyByDatatable(string connectionString, string tableName, DataTable dt, int batchSize,int bulkCopyTimeout=120) { try { using (SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction)) { sqlbulkCopy.BatchSize = batchSize; sqlbulkCopy.DestinationTableName = tableName; sqlbulkCopy.BulkCopyTimeout = bulkCopyTimeout; for (int i = 0; i < dt.Columns.Count; i++) { sqlbulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); } sqlbulkCopy.WriteToServer(dt); sqlbulkCopy.Close();//关闭连接 return true; } } catch (System.Exception ex) { throw ex; } }
使用例子:
1、创建一个数据库、和一个数据表
create database TestBatchOperateMssqlserverDB; go use TestBatchOperateMssqlserverDB; go CREATE TABLE Product( ProductId BIGINT identity(1,1) PRIMARY KEY, ProductName VARCHAR(50) NOT NULL, Price MONEY NOT NULL )
2、建立和数据表结构相同的Datatable
System.Data.DataTable dt = new System.Data.DataTable(); //表的结构要和数据库一样 dt.Columns.AddRange(new System.Data.DataColumn[] { new System.Data.DataColumn("ProductId",typeof(long)), //自增 new System.Data.DataColumn("ProductName",typeof(string)), new System.Data.DataColumn("Price",typeof(decimal)) });
3、为dataTable装配数据
for (int i = 0; i < 100000; i++) { System.Data.DataRow dr = dt.NewRow(); //dr[0] = i; //自增 dr[1] = string.Format("商品{0}", i); dr[2] = (decimal)i; dt.Rows.Add(dr); }
4、将数据插入到数据库
SqlBulkCopyByDatatable("server=.;database=TestBatchOperateMssqlserverDB;uid=sa;pwd=123456" , "Product", dt);