1. 程式人生 > >ADO.NET批量添加數據到SQL Server—BulkCopy使用指南

ADO.NET批量添加數據到SQL Server—BulkCopy使用指南

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使用指南