本人新人,做项目时需要导一个Excel数据到数据库中,由表中数据量比效大,8000到30000条数据,以前是利用DataTable循环成一个List集合,再用方法循环将List集合一条条将记录插入到数据中,数据量大很麻烦,百度很久发了别人的方法,记录一下。
/// <summary>
/// 一次性把DataBable中的数据导入到数据库中
/// </summary>
/// <param name="source">传入的DataTable</param>
/// <param name="tableName">数据库中的表名</param>
/// <returns>返回bool类型提示是否成功</returns>
public bool AddDataTableToDB(DataTable source, string tableName)
{
SqlTransaction tran = null;//声明一个事务对象
//连接字符串取的是webConfig中的
string connstr = ConfigurationManager.ConnectionStrings["ConnectionString_Cloud"].ToString();
try
{
using (SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();//打开链接
using (tran = conn.BeginTransaction())
{
using (SqlBulkCopy copy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran))
{
copy.DestinationTableName = tableName; //指定服务器上目标表的名称
#region 进行字段映射
if (tableName == "DataInfo")
{
copy.ColumnMappings.Add("域", "Field"); //映射时前面为DataTable中的列名,后面为数据库的列名。
copy.ColumnMappings.Add("零件号", "Part_NO");
copy.ColumnMappings.Add("零件描述", "Description");
copy.ColumnMappings.Add("供应商号", "Supplier_NO");
copy.ColumnMappings.Add("供应商名称", "SupplierName");
copy.ColumnMappings.Add("交易状态", "State");
copy.ColumnMappings.Add("标识", "Identification");
copy.ColumnMappings.Add("合并", "Merge_Y");
copy.ColumnMappings.Add("是否代理", "Agent");
copy.ColumnMappings.Add("品牌", "Brand");
copy.ColumnMappings.Add("供应商零件号", "Supplier_Part_NO");
copy.ColumnMappings.Add("责任采购", "Liable");
copy.ColumnMappings.Add("测试报告", "TestReport");
copy.ColumnMappings.Add("有效期", "VLD");
copy.ColumnMappings.Add("审核说明", "Review");
copy.ColumnMappings.Add("结果", "Result");
}
else if (tableName == "")
{
}
#endregion
copy.WriteToServer(source); //执行把DataTable中的数据写入DB
//Alert("11");
tran.Commit(); //提交事务
return true; //返回True 执行成功!
}
}
}
}
catch (Exception ex)
{
if (null != tran)
tran.Rollback();
return false;//返回False 执行失败!
}
}
经测试,可以成功插入,并且速度很快,目前不知道是否有弊端。