ADO.NET批量添加數據到SQL Server—BulkCopy使用指南
阿新 • • 發佈:2018-09-25
ring aps mod pro 模型 i++ 由於 轉換成 property
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; }View Code
ADO.NET批量添加數據到SQL Server—BulkCopy使用指南