PetaPoco批量插入数据

  

  VS添加完组件,自动生成的PetaPoco.cs文件中没有SqlBulkInsert这个方法,但是可以在里面添加,代码如下:

        /// <summary>
        /// BulkInsert
        /// </summary>
        /// <param name="dt">dttable(must 1、columns exactly alike,2、without self-increasing primary key)</param>
        /// <param name="tableName">table name(must include schema)</param>
        /// <param name="fieldName">field name string[](must 1、exactly alike,2、without self-increasing primary key)</param>
        /// <returns></returns>
        public bool SqlBulkInsert(DataTable dt, string tableName, string[] fieldName)
        {
            try
            {
                OpenSharedConnection();
                var entry = ConfigurationManager.ConnectionStrings[1];//获取web.config中的数据库连接字符串
                using (SqlBulkCopy bulk = new SqlBulkCopy(entry.ConnectionString))
                {
                    try
                    {
                        bulk.DestinationTableName = tableName;
                        foreach (string field in fieldName)
                        {
                            bulk.ColumnMappings.Add(field, field);
                        }
                        bulk.WriteToServer(dt);
                        return true;
                    }
                    catch
                    {
                        return false;
                    }
                    finally
                    {
                        bulk.Close();
                    }
                }
            }
            finally
            {
                CloseSharedConnection();
            }
        }

  第一个参数不解释了,把DataTable传过来;第二个是表名,需要注意的是这边需要SQL Server表的全名,包括schema。一般是dbo,但也有可能是别的,例如:org.Provinces;第三个是DataTable中的列名数组,需要注意的是大小写要和数据库中一致。

  如果是List类型数据源,可以通过以下方法得到DataTable数据和其列名数组:

public class ModelConvertHelper<T> where T : new()
    {
//List<T>转成DataTable并返回列名数组
 public static Tuple<DataTable, string[]> batchExecData(List<T> List)
        {
            DataTable dt = new DataTable();
            List<string> list = new List<string>();
            foreach (T entity in List)
            {
                DataRow dr = dt.NewRow();
                foreach (PropertyInfo column in entity.GetType().GetProperties())
                {
                    if (!dt.Columns.Contains(column.Name))
                    {
                        dt.Columns.Add(column.Name);
                        list.Add(column.Name);
                    }
                    object value = column.GetValue(entity);
                    if (value != null)
                    {
                        dr[column.Name] = value;
                    }
                }
                dt.Rows.Add(dr);
            }
            return new Tuple<DataTable, string[]>(dt, list.ToArray());
        }
}

  调用方法:

//得到list数据
Tuple<DataTable, string[]> tule = ChineseAbs.DealLab.Helpers.ModelConvertHelper<AssetPoolData>.batchExecData(list);
var res = m_db.SqlBulkInsert(tule.Item1, "org.Provinces", tule.Item2);

  效果还不错,测试了两万条数据,用了0.5秒左右。

By QJL

原文地址:https://www.cnblogs.com/QiuJL/p/7728739.html