批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储。
采用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; } }
时间: 2024-09-30 10:53:20