如何通过SqlBulkCopy实现批量导入数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过SqlBulkCopy实现批量导入数据相关的知识,希望对你有一定的参考价值。
参考技术A 1、建立一张测试表 testCREATE TABLE test
(
F_Name NVARCHAR(20) NULL,
F_Age INT NULL
)
2、SqlBulkCopy批量插入数据
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Data.SqlClient;
5 using System.Data;
6
7 namespace sqlbulkcopy
8
9 class Program
10
11 static void Main(string[] args)
12
13 DataTable dt = new DataTable();
14 dt.Columns.Add("name", typeof(string));
15 dt.Columns.Add("age", typeof(int));
16
17 DataRow dr = dt.NewRow();
18 dr["name"] = "李想";
19 dr["age"] = 30;
20 dt.Rows.Add(dr);
21
22 dr = dt.NewRow();
23 dr["name"] = "陈琦";
24 dr["age"] = 25;
25 dt.Rows.Add(dr);
26
27 using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("数据库连接串"))
28
29 conn.Open();
30 using (System.Data.SqlClient.SqlBulkCopy bulk = new System.Data.SqlClient.SqlBulkCopy(conn))
31
32 bulk.DestinationTableName = "test"; //要导入的数据表名
33 bulk.BatchSize = dt.Rows.Count; //每一批次中的行数
34 bulk.ColumnMappings.Add("name", "F_Name"); //设置数据源中的列和目标表中的列之间的映射关系
35 bulk.ColumnMappings.Add("age", "F_Age");
36 bulk.WriteToServer(dt);
37 if (bulk != null)
38
39 bulk.Close();
40
41
42 conn.Close();
43
44
45
46 本回答被提问者和网友采纳
如何使用 SqlBulkCopy 并通过 Glimpse 跟踪批量插入
【中文标题】如何使用 SqlBulkCopy 并通过 Glimpse 跟踪批量插入【英文标题】:How to use SqlBulkCopy and track Bulk Inserts with Glimpse 【发布时间】:2016-08-15 05:20:20 【问题描述】:在我们的应用程序中,我们使用SqlBulkCopy
类来促进数据库的批量加载。最近,我尝试将 Glimpse 添加到我们的解决方案中,但代码因无效转换而失败:
System.InvalidCastException:无法将“Glimpse.Ado.AlternateType.GlimpseDbConnection”类型的对象转换为“System.Data.SqlClient.SqlConnection”类型
这是因为 Glimpse ADO 正在使用包装的 SqlConnection
来实现其魔力。不幸的是,SqlBulkCopy
需要 SqlConnection
,所以我需要转换 DbConnection
。
是否没有开箱即用的方法来分析批量插入?到目前为止,我遇到的唯一解决方法是:
(SqlConnection)((GlimpseDbConnection)dbConnection).InnerConnection
这很丑,因为它需要显式引用 GlimpseDbConnection 并且可能还需要添加自定义时间线事件来获得一些跟踪。 没有 Glimpse 插件可以解决这个问题吗?
【问题讨论】:
我不知道有一个。 【参考方案1】:我正在使用这种方法(使用 EntityFramework 的 DbContext
),它似乎有效:
DbContext Db = /* ... */;
var glimpseDbConnection = Db.Database.Connection as GlimpseDbConnection;
var sqlConnection = glimpseDbConnection != null ? (SqlConnection)glimpseDbConnection.InnerConnection : (SqlConnection)Db.Database.Connection;
var glimpseDbTransaction = Db.Database.CurrentTransaction.UnderlyingTransaction as GlimpseDbTransaction;
var sqlTransaction = glimpseDbTransaction != null ? (SqlTransaction)glimpseDbTransaction.InnerTransaction : (SqlTransaction)Db.Database.CurrentTransaction.UnderlyingTransaction;
using (var bulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.Default, sqlTransaction))
var dataTable = /* ... */;
bulkCopy.BatchSize = 2000;
bulkCopy.BulkCopyTimeout = TimeSpan.FromMinutes(5).Seconds;
bulkCopy.DestinationTableName = /* ... */;
bulkCopy.WriteToServer(dataTable);
【讨论】:
以上是关于如何通过SqlBulkCopy实现批量导入数据的主要内容,如果未能解决你的问题,请参考以下文章