• 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;
            }
    View Code
  • 相关阅读:
    jQuery $.each用法
    关于jQuery中的attr和data问题
    AngularJS入门基础PPT(附下载链接)
    依赖注入 | Dependency Injection
    ng事件中为变量的参数
    angularjs factory,service,provider 自定义服务的不同
    $digest already in progress
    理解Angular中的$apply()以及$digest()
    LeetCode 最长连续递增序列
    LeetCode 岛屿的最大面积
  • 原文地址:https://www.cnblogs.com/yuyuefly/p/9700150.html
Copyright © 2020-2023  润新知