如何通过SqlBulkCopy实现批量导入数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过SqlBulkCopy实现批量导入数据相关的知识,希望对你有一定的参考价值。

参考技术A 1、建立一张测试表 test

CREATE 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实现批量导入数据的主要内容,如果未能解决你的问题,请参考以下文章

如何高效地批量导入数据到SqlServer

tsc4503批量导入

如何高效地批量导入数据到SqlServer

大数据处理高效能,大数据量存储方案SqlBulkCopy

转移,清洗,同步数据

SqlBulkCopy 的推荐批量大小是多少?