用途说明:

公司要求做一个数据导入程序,要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储。于是在网上进行查找,发现了一个比较好的解决方案,就是采用SqlBulkCopy来处理存储数据。SqlBulkCopy存储大批量的数据非常的高效,就像这个方法的名字一样,可以将内存中的数据表直接的一次性的存储到数据库中,而不需要一次一次的向数据库Insert数据。初次实验,百万级别的数据表,也只需几秒时间内就可以完全的存入数据库中,其速度,比传统的Insert方法不止快百倍千倍

      #region 批量添加实名认证信息(万级)
/// <summary>
/// 批量添加实名认证信息(万级)
/// </summary>
/// <returns></returns>
[Route("Test/BatchAddNciicUserInfo")]
[HttpGet]
public async Task<string> BatchAddNciicUserInfo()
{
DateTime regtime = DateTime.Parse("2019-06-24");
int i = ;
using (var db = new GPAppEntities())
{
using (SqlConnection conn = db.Database.Connection as SqlConnection)
{
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
using (SqlTransaction tran = conn.BeginTransaction())
{
db.Database.UseTransaction(tran);
try
{
var userlist = db.AppUser.Where(a => a.RegisterTime > regtime).OrderBy(a=>a.RegisterTime).Select(s => new { s.ID,s.MobilePhone}).Take().ToList();
StreamReader sr = new StreamReader(@"D:\Deploy\GPApp.Api\Content\Test\APP用户数据.txt", Encoding.Default);
String line;
List<IDCardNo> list = new List<IDCardNo>();
while ((line = sr.ReadLine()) != null)
{
var model = new IDCardNo();
model.Number = line;
list.Add(model);
} using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran))
{ DataTable dtSource = new DataTable();
dtSource.Columns.Add("ID", typeof(Guid));
dtSource.Columns.Add("UserId", typeof(Guid));
dtSource.Columns.Add("RealName", typeof(string));
dtSource.Columns.Add("Gender", typeof(string));
dtSource.Columns.Add("IDCardNo", typeof(string));
dtSource.Columns.Add("IDCardNoEncrypt", typeof(string));
dtSource.Columns.Add("IDCardAgency", typeof(string));
dtSource.Columns.Add("IDCardStartDate", typeof(DateTime));
dtSource.Columns.Add("IDCardEndDate", typeof(DateTime));
dtSource.Columns.Add("Portrait", typeof(string));
dtSource.Columns.Add("FIDCard", typeof(string));
dtSource.Columns.Add("BIDCard", typeof(string));
dtSource.Columns.Add("Status", typeof(string));
dtSource.Columns.Add("AppSystem", typeof(string));
dtSource.Columns.Add("AppDevice", typeof(string));
dtSource.Columns.Add("AppIP", typeof(string));
dtSource.Columns.Add("CreateDate", typeof(DateTime));
dtSource.Columns.Add("ModifyDate", typeof(DateTime));
dtSource.Columns.Add("Birthday", typeof(DateTime));
foreach (var item in userlist)
{
DataRow newdr = dtSource.NewRow();
newdr["ID"] = Guid.NewGuid();
newdr["UserId"] = item.ID;
newdr["RealName"] = "叶长种";
newdr["Gender"] = "男";
newdr["IDCardNo"] = list[i].Number;
newdr["IDCardNoEncrypt"] = SHA256Help.sha256(list[i].Number).ToLower();
newdr["IDCardAgency"] = "上海市公安局黄浦分局";
newdr["IDCardStartDate"] = DateTime.Parse("2010-01-01 00:00:00");
newdr["IDCardEndDate"] = DateTime.Parse("2020-01-01 00:00:00");
newdr["Portrait"] = "";
newdr["FIDCard"] = "";
newdr["BIDCard"] = "";
newdr["Status"] = "一致";
newdr["AppSystem"] = "";
newdr["AppDevice"] ="";
newdr["AppIP"] = "";
newdr["CreateDate"] = DateTime.Now;
newdr["ModifyDate"] = DateTime.Now;
newdr["Birthday"] = DateTime.Parse("1989-01-28 00:00:00");
dtSource.Rows.Add(newdr);
i = i + ;
} sqlBC.BatchSize = ;
sqlBC.BulkCopyTimeout = ;
sqlBC.DestinationTableName = string.Format("dbo.NciicUserInfo");
sqlBC.ColumnMappings.Add("ID", "ID");
sqlBC.ColumnMappings.Add("UserId", "UserId");
sqlBC.ColumnMappings.Add("RealName", "RealName");
sqlBC.ColumnMappings.Add("Gender", "Gender");
sqlBC.ColumnMappings.Add("IDCardNo", "IDCardNo");
sqlBC.ColumnMappings.Add("IDCardNoEncrypt", "IDCardNoEncrypt");
sqlBC.ColumnMappings.Add("IDCardAgency", "IDCardAgency");
sqlBC.ColumnMappings.Add("IDCardStartDate", "IDCardStartDate");
sqlBC.ColumnMappings.Add("IDCardEndDate", "IDCardEndDate");
sqlBC.ColumnMappings.Add("Portrait", "Portrait");
sqlBC.ColumnMappings.Add("FIDCard", "FIDCard");
sqlBC.ColumnMappings.Add("BIDCard", "BIDCard");
sqlBC.ColumnMappings.Add("Status", "Status");
sqlBC.ColumnMappings.Add("AppSystem", "AppSystem");
sqlBC.ColumnMappings.Add("AppDevice", "AppDevice");
sqlBC.ColumnMappings.Add("AppIP", "AppIP");
sqlBC.ColumnMappings.Add("CreateDate", "CreateDate");
sqlBC.ColumnMappings.Add("ModifyDate", "ModifyDate");
sqlBC.ColumnMappings.Add("Birthday", "Birthday");
sqlBC.WriteToServer(dtSource);
}
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
} }
}
return "添加成功";
}
public class IDCardNo
{
public string Number { get; set; }
}
#endregion

最短时间(几秒内)利用C#往SQLserver数据库一次性插入10万条数据的更多相关文章

  1. 使用hibernate在5秒内插入11万条数据,你觉得可能吗?

    需求是这样的,需要查询某几个表的数据,然后插入到另外一个表. 一看到需求,很多人都会用hibernate去把这些数据都查询出来,然后放到list中, 然后再用for循环之类的进行遍历,一条一条的取出数 ...

  2. C# 使用EPPlus 秒导出10万条数据

    1.先要引用dll文件,可以直接使用vs自带的包管理,如下图: 输入 EPPlus 我这里是安装过了的所以这里显示的是卸载而不是安装. 安装成功了之后会看到这个dll文件 代码如下: //导出Exce ...

  3. 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...

  4. 通过数组方式向Oracle大批量插入数据(10万条11秒)

    1.创建数据库Person CREATE TABLE Person( id number, name nvarchar2() , age number , sex nvarchar2() , pass ...

  5. C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    作者: Aicken(李鸣)  来源: 博客园  发布时间: 2010-09-08 15:00  阅读: 4520 次  推荐: 0                   原文链接   [收藏] 摘要: ...

  6. 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒

    链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...

  7. 2020-04-23:假设一个订单的编号规则是AAAAOrder2020-0000001,AAAAOrder2020-0000002....后面的数字是自增长,如果订单号码达到AAAAOrder2020-1000000(100万),数据库中应该有100万条数据,此时我随机删除2条数据(物理删除,且不考虑日志和备份),请问怎么找到删掉的数据的编号?给出解题思路即可,答案需要在1秒内运行得到。

    福哥答案2020-04-23: 分批查询:分成500次count(),每次count()肯定小于等于2000条数据,经过测试,一次count()在.1ms左右,500次就是500ms.二分法(时间微超 ...

  8. MySQL插入10万数据时间(结论:最快14.967s,每秒插入6681条)

    记录我的一次MySQL操作Demo: 存储过程: DROP PROCEDURE IF EXISTS my_insert; CREATE PROCEDURE my_insert() BEGIN ; lo ...

  9. (C#版本)提升SQlite数据库效率——开启事务,极速插入数据,3秒100万,32秒1000万条数据

    SQLite插入数据效率最快的方式就是:开启事务  +   insert语句  +  关闭事务(提交) 利用事务的互斥性,如果在批量的插入操作前显式地开启一次事务,在插入操作结束后,提交事务,那么所有 ...

随机推荐

  1. Dynamics CRM - js中用webapi基于fetchxml查询遇到的问题 -- Invalid URI: The Uri scheme is too long.

    最近用WebApi做基于Fetchxml的查询的时候,遇到一个很蛋疼的报错:Invalid URI: The Uri scheme is too long. 检查了整个URL,也没发现有什么问题. - ...

  2. 常用adb命令总结

    前言 很早就想整理一下自己平时常用的一些adb命令,不仅为了便于以后查找,而且整理的过程自己又重新复习了一遍,但是当我开始在度娘一搜的时候,发现很多人已经写的非常详细了,尤其是当我发现了这篇adb概括 ...

  3. AudioRecord 录制播放PCM音频

    AudioRecord 与 MediaRecorder 区别 AudioRecord 基于字节流录制,输出的是pcm数据,未进行压缩,直接保存的pcm文件不能被播放器识别播放. 可以对音频文件进行实时 ...

  4. IDEA中GitLab的使用

    首先安装git https://git-scm.com/downloads/ 下载对应的版本 下载好了,安装打开 Windows. 打开之后2步走,与git连接 首先选择仓库,进行git init本地 ...

  5. bay——巡检RAC日志.txt

    -查找超过800M大小文件,并显示查找出来文件的具体大小,可以使用下面命令 find . -type f -size +400M -print0 | xargs -0 du -h --查看当前目录下每 ...

  6. Script - 检查当前的undo配置和建议设置 (Doc ID 1579035.1)

    Script - Check Current Undo Configuration and Advise Recommended Setup (Doc ID 1579035.1) APPLIES TO ...

  7. MySQL的基础架构

    TCP/IP看不下去了,我觉得还是从应用层入手,接下来2个月我将主要学习数据库相关和算法知识,网络我一直不熟,所以看起专业书籍很吃力,可以说是浪费时间,这次数据库学习目标是先将方向纠正一下,然后其中的 ...

  8. Linux运维基础篇大全

    基础知识的文章都在这里https://www.jianshu.com/u/a3c215af055a ,想要了解,请访问这个地址!!!!

  9. Vue 监听鼠标左键 鼠标右键以及鼠标中键修饰符click.left&contextmenu&click.middle

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 基于Django的Rest Framework框架的分页组件

    本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...