创建了一个用来测试的Student表:

  1. CREATE TABLE [dbo].[Student](
  2. [ID] [int] PRIMARY KEY NOT NULL,
  3. [Num] [varchar](10) NULL,
  4. [Name] [nvarchar](64) NULL,
  5. [Age] [int] NULL
  6. )

一、SqlBulkCopy类

  使用数据库BCP协议进行数据的批量复制,每一批的数量大约800条。

  1. /// <summary>
  2. /// 批量插入Sqlsbc
  3. /// </summary>
  4. /// <param name="dt"></param>
  5. /// <param name="tableName">表名</param>
  6. public static void BatchInsertBySqlsbc(DataTable dt, string tableName)
  7. {
  8. using (SqlBulkCopy sbc = new SqlBulkCopy(connString))
  9. {
  10. sbc.BatchSize = dt.Rows.Count; //分批提交记录数,可不设
  11. sbc.sbcTimeout = ; //超时时间设置
  12. sbc.DestinationTableName = tableName; // 设置目标表名称
  13. // 列名映射 格式:ColumnMappings.Add("源数据列", "目标表对应列名称");
  14. for (int i = ; i < dt.Columns.Count; i++)
  15. {
  16. sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, i);
  17. }
  18. //也可以像下面这样进行映射
  19. //sbc.ColumnMappings.Add("ID", "ID");
  20. //sbc.ColumnMappings.Add("Num", "Num");
  21. //sbc.ColumnMappings.Add("Name", "Name");
  22. //sbc.ColumnMappings.Add("Age", "Age");
  23. sbc.WriteToServer(dt); //全部写入数据库
  24. }
  25. }

5万条数据插入花了2秒的时间:

二、表值参数

  也叫表变量参数,使用用户定义的表类型来声明,简单理解就是可以把一个表当做参数传递。

  1. CREATE TYPE [dbo].[mytb_student] AS TABLE(
  2. [ID] [int] NOT NULL,
  3. [Num] [varchar](10) NULL,
  4. [Name] [nvarchar](64) NULL,
  5. [Age] [int] NULL
  6. )
  1. /// <summary>
  2. /// 批量插入使用表值参数
  3. /// </summary>
  4. /// <param name="dt"></param>
  5. public static void BatchInsertByTableValue(DataTable dt, string sqlText)
  6. {
  7. using (SqlConnection sqlConn = new SqlConnection(connString))
  8. {
  9. using (SqlCommand sqlCmd = new SqlCommand(sqlText, sqlConn))
  10. {
  11. //把DataTable当做参数传入
  12. SqlParameter sqlPar = sqlCmd.Parameters.AddWithValue("@dt", dt);
  13. //指定表值参数中包含的构造数据的特殊数据类型。
  14. sqlPar.SqlDbType = SqlDbType.Structured;
  15. sqlPar.TypeName = "dbo.mytb_student";//表值参数名称
  16. sqlConn.Open();
  17. sqlCmd.ExecuteNonQuery();
  18. }
  19. }
  20. }

同样插入5万条数据,也是花了2秒的时间。

  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("开始时间:"+DateTime.Now);
  4. DataTable dt=GetDataTable();
  5. Console.WriteLine("插入数量:"+dt.Rows.Count+"条");
  6. string sqlText=@"insert into Student(ID,Num,Name,Age)
  7. select t.ID,t.Num,t.Name,t.Age from @dt as t";
  8. SqlHelper.BatchInsertByTableValue(dt,sqlText);
  9. Console.WriteLine("结束时间:"+DateTime.Now);
  10. Console.ReadKey();
  11. }

总结:SqlServer数据库批量插入除了使用SqlBulkCopy和表值参数,还可以使用SqlDataAdapter的Update方法,经过本人测试,在数据量越大的情况下,使用SqlBulkCopy的性能是最好的。

C# 数据库批量插入数据之 —— SqlBulkCopy、表值参数的更多相关文章

  1. SQL:数据库批量插入数据

    测试中有些功能要求有足够的数据进行测试,当输入字段较多时通过页面添加很慢.业务只关联单个数据库表可以通过数据库批量插入数据 批量插入数据示例: declare @i int--声明变量 --变量初始化 ...

  2. c# 数据库批量插入数据SqlBulkCopy 示例

    /// <summary> /// 批量插入数据 /// </summary> public static void SqlBulkInsert(DataTable dt, s ...

  3. SQL Server 批量插入数据方案 SqlBulkCopy 的简单封装,让批量插入更方便

    一.Sql Server插入方案介绍 关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert.BatchInsert.SqlBulkCopy,下面我们对比以下三种方案的速度 ...

  4. jmeter连接mysql数据库批量插入数据

    前提工作: 1.在jmeter官网下载jmeter包(官网地址:https://jmeter.apache.org/).此外还需下载mysql驱动包,如:mysql-connector-java-5. ...

  5. Django向数据库批量插入数据

    # 如何向数据库一次性插入多条数据 # 方法一:效率极低,不推荐使用 for i in range(1000): models.Book.objects.create(title=f'第{i}本书') ...

  6. 批量插入数据 C# SqlBulkCopy使用

    转自:http://blog.csdn.net/wangzh300/article/details/7382506 private static void DataTableToSQLServer( ...

  7. IBatis 批量插入数据之SqlBulkCopy

    public void AddLetters(IList<int> customerIds, string title, string content, LetterEnum.Letter ...

  8. 数据库批量插入数据的shell脚本

    测试用,先来一个简单的,这个是国产神通数据库的,用isql命令: !/bin/bash == "-h" ] then echo "USAGE: $0 table_name ...

  9. net core天马行空系列-各大数据库快速批量插入数据方法汇总

    1.前言 hi,大家好,我是三合.我是怎么想起写一篇关于数据库快速批量插入的博客的呢?事情起源于我们工作中的一个需求,简单来说,就是有一个定时任务,从数据库里获取大量数据,在应用层面经过处理后再把结果 ...

随机推荐

  1. How to proof RSA

    欧拉函数 :欧拉函数是数论中很重要的一个函数,欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) . 完全余数集合:定义小于 n 且和 n 互质的数 ...

  2. Condition线程通信(七)

    前言:对于线程通信,使用synchronized时使用wait.notify和notifyAll来实行线程通信.而使用Lock如何处理线程通信呢?答案就是本片的主角:Condition. 一.Cond ...

  3. 使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件

    使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件

  4. codeforces-962-c

    题意:给你一个数,问从中删除某几位数字后重新组成的数字是否是某个数的平方: 解题思路:数据小,dfs直接搜,每位数只有两种选择,要或者不要 #include<iostream> #incl ...

  5. PKU2018校赛 H题 Safe Upper Bound

    http://poj.openjudge.cn/practice/C18H 题目 算平均数用到公式\[\bar{x}=\frac{x_1+x_2+x_3+\cdots+x_n}{n}\] 但如果用in ...

  6. Nginx http反向代理流程Proxy_pass模块

    L:88 反向代理代码示列 server { listen ; server_name shop**.com.cn; location /{ proxy_pass http://test/www; p ...

  7. BZOJ2084[Poi2010]Antisymmetry——回文自动机

    题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...

  8. Yahoo Programming Contest 2019 补题记录(DEF)

    D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...

  9. 【转】设置 vim 显示行号永久有效

    在linux环境下,vim是常用的代码查看和编辑工具.在程序编译出错时,一般会提示出错的行号,但是用vim打开的代码确不显示行号,错误语句的定位非常不便.那么怎样才能让vim显示代码的行号呢? 1 临 ...

  10. Zabbix-proxy安装部署

    原文链接:https://www.cnblogs.com/irockcode/p/6754659.html 环境: 因为公司需要监控远程客户机,但server端无法主动连接agent端,客户端可以连接 ...