public static class SqlConnectionExtension
{
/// <summary>
/// 使用 SqlBulkCopy 向 destinationTableName 表插入数据
/// </summary>
/// <typeparam name="TModel">必须拥有与目标表所有字段对应属性</typeparam>
/// <param name="conn">连接字符串</param>
/// <param name="modelList">要插入的数据</param>
/// <param name="batchSize">SqlBulkCopy.BatchSize</param>
/// <param name="destinationTableName">表名</param>
public static int BulkCopy<TModel>(string connstr, List<TModel> list, int batchSize, string destinationTableName)
{
var table = new DataTable();
var type = typeof(TModel);
int rValue = 0;
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlCommand cmd = new SqlCommand("select * from [" + destinationTableName + "] where 1=2", conn);
// 执行
conn.Open();
var reader = cmd.ExecuteReader();
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, null) ?? DBNull.Value;
}
table.Rows.Add(row);
}
reader.Close();
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn as SqlConnection);
bulkCopy.DestinationTableName = destinationTableName;
bulkCopy.BatchSize = batchSize;
try
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
var dataReader = table.CreateDataReader();
if (table != null && table.Rows.Count != 0)
bulkCopy.WriteToServer(dataReader);
rValue = table.Rows.Count;
}
catch (Exception ex)
{
rValue = 0;
conn.Close();
throw ex;
}
finally
{
if (bulkCopy != null)
bulkCopy.Close();
}
}
return rValue;
}
}