ADO.NET批量添加数据到SQL Server—BulkCopy使用指南
BulkCopy位于System.Data.SqlClient命名空间,允许你使用其他源的数据有效地批量加载 SQL Server 表。
属性:
BatchSize :每个批处理中的行数。 在每个批处理结束时,批处理中的行将发送到服务器。
BulkCopyTimeout:超时之前可用于完成操作的秒数。
ColumnMappings:返回 SqlBulkCopyColumnMapping 项的集合。 列映射定义数据源中的列和目标中的列之间的关系。
DestinationTableName:服务器上的目标表的名称。
EnableStreaming:启用或禁用 SqlBulkCopy 对象,以流式传输 IDataReader 对象中的数据。
NotifyAfter:定义生成通知事件之前要处理的行数。
今天测试了一下BulkCopy的速度,100W的数据量存储在List<T>中,把List转化成Datatable后使用BulkCopy批量添加,总平均时间仅为7.5秒。以下是使用方式。
1.首先是数据库操作方法
/// <summary> /// 批量添加 /// </summary> /// <param name="sqlBulkCopyColumnMappings">缓存数据表DataTable的列与SQL Server数据表列的映射关系</param> /// <param name="dataTable">缓存数据表DataTable</param> public static void SqlBulkCopy(List<SqlBulkCopyColumnMapping> sqlBulkCopyColumnMappings, DataTable dataTable) { using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(datalink.ConnectionString)) { sqlBulkCopy.DestinationTableName = "Student"; sqlBulkCopy.BatchSize = 10; foreach (var item in sqlBulkCopyColumnMappings) { sqlBulkCopy.ColumnMappings.Add(item.SourceColumn, item.DestinationColumn); } sqlBulkCopy.WriteToServer(dataTable); } }
说明:如果模型类Model与数据表字段一一对应,第一个参数sqlBulkCopyColumnMappings使用空构造方法创建一个即可。由于这是Student表的数据库操作类,所以DestinationTableName直接赋值Student。
2.可能需要以下辅助类,把List数据转化成DataTable
/// <summary> /// List集合转换成DataTable /// </summary> /// <param name="list"></param> /// <returns></returns> public static DataTable ListToDataTable(IList list) { DataTable result = new DataTable(); if (list.Count > 0) { PropertyInfo[] propertys = list[0].GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { //获取类型 Type colType = pi.PropertyType; //当类型为Nullable<>时 if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>))) { colType = colType.GetGenericArguments()[0]; } result.Columns.Add(pi.Name, colType); } for (int i = 0; i < list.Count; i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in propertys) { object obj = pi.GetValue(list[i], null); tempList.Add(obj); } object[] array = tempList.ToArray(); result.LoadDataRow(array, true); } } return result; }