用途说明:

公司要求做一个数据导入程序,要求将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. OpenCV:图像的普通二值化

    首先我们来看看图像二值化的过程,opencv一共有好几种不同的二值化算法可以使用,一般来说图像的像素,亮度等条件如果超过了某个或者低于了某个阈值,就会恒等于某个值,可以用于某些物体轮廓的监测: 导包: ...

  2. Thymeleaf常用语法:模板文件中表达式调用Java类的静态方法

    在模板文件的表达式中,可以使用“${T(全限定类名).方法名(参数)}”这种格式来调用Java类的静态方法. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1. ...

  3. MyBatis之接口绑定方案及多参数传递

    1.说明   所谓的MyBatis接口绑定,指的是实现创建一个接口后,把mapper.xml 由mybatis 生成接口的实现类,通过调用接口对象就可以获取mapper.xml 中编写的sql.在SS ...

  4. ORM优化查询、choices参数

    目录 ORM查询优化 only与defer select_related和prefetch_related MTV与MVC模型 choices参数 ORM查询优化 only与defer res = m ...

  5. LInux:YUM源安装工具的配置及使用

    YUM源的设置及使用 YUM工具简介 (1)YUM(Yellow dog Upadate Modifie)是改进版的 RPM 管理器,很好地解决了 RPM 软件包的依赖问题. (2)YUM 可以从很多 ...

  6. go语言设计模式之Chain Of Responsibility(责任链)

    ChainOfResponsibility.go package ChainOfResponsibility import ( "fmt" "io" " ...

  7. 定义私有指令 v-fontweight

    // 这是一个私有的指令 他是在vm这个实例对象里里面的 所以说是私有的 directives 多一个s // 在css中是font-Weight.在第二个字母的大写该为小写,去掉横线. // 这中写 ...

  8. class与class的继承

    class Point{ constructor(x,y){ this.x = x; this.y = y; } toString(){ return '(' + this.x + ',' + thi ...

  9. NopCommerce 4.2的安装与运行

    一.关于NopCommerce NopCommerce是国外ASP.Net领域一个高质量的B2C开源电商项目,最新版本4.2基于ASP.NET Core MVC 2.2和EF Core 2.2开发,其 ...

  10. Yii2处理密码加密及验证

    在Yii2中提供了密码加密以及验证的一系列方法,方便我们的使用,它使用的是bcrypt算法.查看源码我们可以发现它使用的是PHP函数password_hash()和crypt()生成. 加密: /** ...