//效率,dapper add list 8000条 40秒,它只要1秒多
public static int SqlBulkCopy<T>(this DbConnection conn, List<T> list) where T : Key
{
var type = typeof(T);
var isClose = conn.IsNull();
conn = ConnInit(conn, list.FirstOrDefault().Key);
var table = new DataTable();
var reader = conn.ExecuteReader($"select * from [{type.Name}] where 1=2");
table.Load(reader);
foreach (var item in list)
{
var row = table.NewRow();
foreach (DataColumn column in table.Columns)
{
row[column] = type.GetProperty(column.ColumnName)?.GetValue(item) ?? DBNull.Value;
}
table.Rows.Add(row);
}
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn as SqlConnection);
bulkCopy.DestinationTableName = type.Name;
bulkCopy.BatchSize = table.Rows.Count;
try
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
var dataReader = table.CreateDataReader();
if (table != null && table.Rows.Count != 0)
bulkCopy.WriteToServer(dataReader);
}
catch (Exception ex)
{
conn?.Close();
throw ex;
}
finally
{
if (isClose)
{
conn?.Close();
}
if (bulkCopy != null)
bulkCopy.Close();
}
return table.Rows.Count;
}