公司最近开发了一个功能,就是通过excel直接往数据库中导入大批量数据。于是在网上查找了几种方法,探索如下:
1.通过insert to 语句
实现:通过将数据导入到DataTable中然后逐条生成sql插入语句导入数据。
优点:简单
缺点:只能应付小数据,所以对于大数据不推荐
2.通过SqlBulkCopy方式
实现:
SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction);
sqlbulkcopy.DestinationTableName = "Product";//数据库中的表名
sqlbulkcopy.ColumnMappings.Add("ProductID", "ProductID");//映射
sqlbulkcopy.ColumnMappings.Add("ProductName", "Name");
sqlbulkcopy.WriteToServer(dataset.Tables[0]);
优点:快
缺点:只能将数据直接复制到正式表中,不能将数据直接导入到tempdb数据库中的临时表中;SqlBulkCopy操作可能会导致对目标表元数据的更改(例如,禁用约束检查 时)。如果出现这种情况,访问大容量插入表的并发快照隔离事务将失败;SqlBulkCopy将向数据库下大容量更新锁,请注意并发性,以免其他连接因长时间等待而超时
机制:(1)利用BCP协议进行数据批量复制
3.使用标值参数
实现:
数据库执行脚本如下
CREATE TYPE TestType AS TABLE ( Id int NOT NULL ,Name nvarchar(20) NOT NULL )
CREATE PROC InsertData @rows TestType READONLY as begin set nocount on insert into TestTable(Id, Name) select Id, Name from @rows end
SqlParameter param = cmd.Parameters.AddWithValue("@rows", tempTable);
param.SqlDbType = SqlDbType.Structured;
param.TypeName = "TestType";
cmd.ExecuteNonQuery();
优点:速度中等
缺点:要在数据库中创建表类型数据