最短时间(几秒内)利用C#往SQLserver数据库一次性插入10万条数据
用途说明:
公司要求做一个数据导入程序,要求将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万条数据的更多相关文章
- 使用hibernate在5秒内插入11万条数据,你觉得可能吗?
需求是这样的,需要查询某几个表的数据,然后插入到另外一个表. 一看到需求,很多人都会用hibernate去把这些数据都查询出来,然后放到list中, 然后再用for循环之类的进行遍历,一条一条的取出数 ...
- C# 使用EPPlus 秒导出10万条数据
1.先要引用dll文件,可以直接使用vs自带的包管理,如下图: 输入 EPPlus 我这里是安装过了的所以这里显示的是卸载而不是安装. 安装成功了之后会看到这个dll文件 代码如下: //导出Exce ...
- 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)
原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...
- 通过数组方式向Oracle大批量插入数据(10万条11秒)
1.创建数据库Person CREATE TABLE Person( id number, name nvarchar2() , age number , sex nvarchar2() , pass ...
- C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)
作者: Aicken(李鸣) 来源: 博客园 发布时间: 2010-09-08 15:00 阅读: 4520 次 推荐: 0 原文链接 [收藏] 摘要: ...
- 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒
链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...
- 2020-04-23:假设一个订单的编号规则是AAAAOrder2020-0000001,AAAAOrder2020-0000002....后面的数字是自增长,如果订单号码达到AAAAOrder2020-1000000(100万),数据库中应该有100万条数据,此时我随机删除2条数据(物理删除,且不考虑日志和备份),请问怎么找到删掉的数据的编号?给出解题思路即可,答案需要在1秒内运行得到。
福哥答案2020-04-23: 分批查询:分成500次count(),每次count()肯定小于等于2000条数据,经过测试,一次count()在.1ms左右,500次就是500ms.二分法(时间微超 ...
- MySQL插入10万数据时间(结论:最快14.967s,每秒插入6681条)
记录我的一次MySQL操作Demo: 存储过程: DROP PROCEDURE IF EXISTS my_insert; CREATE PROCEDURE my_insert() BEGIN ; lo ...
- (C#版本)提升SQlite数据库效率——开启事务,极速插入数据,3秒100万,32秒1000万条数据
SQLite插入数据效率最快的方式就是:开启事务 + insert语句 + 关闭事务(提交) 利用事务的互斥性,如果在批量的插入操作前显式地开启一次事务,在插入操作结束后,提交事务,那么所有 ...
随机推荐
- echarts背景颜色渐变的三种类型
// 线性渐变,多用于折线柱形图,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比,如果 globalCoord 为 `true`,则该四个值是绝对的 ...
- iOS 自定义导航栏
参考链接:https://blog.csdn.net/huanglinxiao/article/details/100537988 demo下载地址:https://github.com/huangx ...
- MySQL数据库:排序及limit的使用
排序 排序方式: 升序--asc(默认:从小到大) 降序--desc(由大到小) # 排序语法: order by 字段1 [asc]|desc[,字段2 [adc]|desc,--] limit # ...
- Redis—数据操作
redis是key-value的数据,所以每个数据都是一个键值对. 数据操作的全部命令,可以查看中文网站. 键的类型是字符串 值的类型分为五种: 字符串string 哈希hash 列表list 集合s ...
- MATLAB实例:非线性曲线拟合
MATLAB实例:非线性曲线拟合 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 用最小二乘法拟合非线性曲线,给出两种方法:(1)指定非线性函数,(2) ...
- 201871010102-常龙龙《面向对象程序设计(java)》第十五周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- R语言-laohuji
项目三-tiger机 说明:每玩一次老ji游戏需要花费一元钱.钻石符号(DD)可以百搭,并且能够将最终的金额加倍. 任务分解: 任务分解的步骤: 将复杂的任务分解为一些简单的子任务: 使用实例: 用通 ...
- 如何理解Virtual DOM
什么是虚拟DOM 接下来用vdom(Virtual DOM)来简称为虚拟DOM. 指的是用JS模拟的DOM结构,将DOM变化的对比放在JS层来做.换而言之,虚拟DOM就是JS对象.如下DOM结构: & ...
- java之获取变量的类型
java要获取变量的类型必须自己定义一个函数: public class Test{ public static void main(String[] args) { short a = 1; a + ...
- new 关键字 和 newInstance() 方法的 区别
区别1: new是一个关键字,可以说是一个指令: newInstance()是一个方法,Class对象的一个方法. 区别2: new主要作用是在内存中生成一个实例,而这个类可以没有提前加载到内从中: ...