BulkSqlCopy 批量导入数据(Ef支持)
Ado.net对批量数据的支持相信大家都已经非常熟悉。再此就不在多说,就当是给自己备个份,没办法,这个方法太好用了。
public static void BulkCreate( string tableName,bool IsGuid=true)
{
string sql = string.Format("select * from {0}",tableName);
DataTable dt = new DataTable();
using (SqlDataAdapter da = new SqlDataAdapter(sql, constr))
{
da.Fill(dt);
}
if (dt != null && dt.Rows.Count > )
{
using (var tran = db.Database.BeginTransaction())
{
try
{
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(db.Database.Connection.ConnectionString))
{ //每1W条一个事物
sqlBulkCopy.BatchSize = ;
sqlBulkCopy.BulkCopyTimeout = ;
sqlBulkCopy.DestinationTableName = string.Format("dbo.{0}", tableName);
sqlBulkCopy.BatchSize = dt.Rows.Count;
if (!IsGuid)
{//如果主键不是Guid,是Int自增类型,这个时候就需要注意了,直接忽略第一列,所以for循环从1开始。
for (int i = ; i < dt.Columns.Count; i++)
{
sqlBulkCopy.ColumnMappings.Add(i, i);
}
}
sqlBulkCopy.WriteToServer(dt);
tran.Commit();
}
}
catch
{
tran.Rollback();
} }
}
}
上面简单实现了下,如果是EntityFrameWork 怎么办,不想让代码层面出现不和谐的红色sql语句。很简单,只需要三个参数,一个是表名(可以根据映射的实体特性[Attribute]获得),一个是列名,最后是列值,后面的两个自然是根据反射获得了。下面简单实现下,只当做参考,请原谅:
public void BulkCreate<T>(List<T> list) where T : new()
{
DataTable dt = new DataTable();
Type type = typeof(T);
string tableName = GetTableName(type);
PropertyInfo[] propes = type.GetProperties();
foreach (var prop in propes)
{
dt.Columns.Add(prop.Name);
}
//再此是假设数据库列与对象列一致 没有判断列属性,如果有列属性的话 ,就需要再多一次判断
foreach (var entity in list)
{
DataRow row = dt.NewRow();
foreach (DataColumn col in dt.Columns)
{
foreach (var prop in propes)
{
if (!col.ColumnName.Equals("id", StringComparison.InvariantCultureIgnoreCase))
{
if (prop.Name.Equals(col.ColumnName, StringComparison.InvariantCultureIgnoreCase))
row[col.ColumnName] = prop.GetValue(entity);
}
} }
dt.Rows.Add(row);
}
if (dt != null && dt.Rows.Count > )
{
using (var tran = db.BeginTransaction())
{
try
{
BulkCopy(dt, tableName);
}
catch (Exception e)
{
tran.Rollback();
}
tran.Commit();
} }
} private bool BulkCopy(DataTable dt, string name)
{
//string constr = System.Configuration.ConfigurationManager.ConnectionStrings["BingStampAzureContext"].ToString();
string constr = db.Database.Connection.ConnectionString;
SqlBulkCopy sqlBulkCopy = null;
try
{
using (SqlConnection conn = new SqlConnection(constr))
{
sqlBulkCopy = new SqlBulkCopy(constr);
sqlBulkCopy.BulkCopyTimeout = ;
sqlBulkCopy.DestinationTableName = string.Format("dbo.{0}", name);
sqlBulkCopy.BatchSize = dt.Rows.Count;
sqlBulkCopy.WriteToServer(dt);
} return true;
}
catch (Exception ex)
{
return false;
}
finally
{
if (sqlBulkCopy != null) sqlBulkCopy.Close();
}
} public string GetTableName(Type type)
{
object[] attributes = type.GetCustomAttributes(false);
if (attributes.Length > )
{
var attribute = (System.ComponentModel.DataAnnotations.Schema.TableAttribute)attributes[];
return attribute.Name;
}
else
return string.Empty;
}
下面给个对象调用下 :
[Table("Student")]
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string Remark { get; set; }
}
具体测试略。。
BulkSqlCopy 批量导入数据(Ef支持)的更多相关文章
- Cassandra使用pycassa批量导入数据
本周接手了一个Cassandra系统的维护工作,有一项是需要将应用方的数据导入我们维护的Cassandra集群,并且为应用方提供HTTP的方式访问服务.这是我第一次接触KV系统,原来只是走马观花似的看 ...
- csv文件批量导入数据到sqlite。
csv文件批量导入数据到sqlite. 代码: f = web.input(bs_switch = {}) # bs_switch 为from表单file字段的namedata =[i.split( ...
- 使用python向Redis批量导入数据
1.使用pipeline进行批量导入数据.包含先使用rpush插入数据,然后使用expire改动过期时间 class Redis_Handler(Handler): def connect(self) ...
- Redis批量导入数据的方法
有时候,我们需要给redis库中插入大量的数据,如做性能测试前的准备数据.遇到这种情况时,偶尔可能也会懵逼一下,这里就给大家介绍一个批量导入数据的方法. 先准备一个redis protocol的文件( ...
- 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库
将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...
- 批量导入数据到mssql数据库的
概述 批量导入数据到数据库中,我们有好几种方式. 从一个数据表里生成数据脚本,到另一个数据库里执行脚本 从EXCEL里导入数据 上面两种方式,导入的数据都会生成大量的日志.如果批量导入5W条数据到数据 ...
- asp.net线程批量导入数据时通过ajax获取执行状态
最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入sessi ...
- ADO.NET 对数据操作 以及如何通过C# 事务批量导入数据
ADO.NET 对数据操作 以及如何通过C# 事务批量导入数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...
- asp.net 线程批量导入数据,ajax获取执行状态
最近做了一个批量导入功能,长时间运行,没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过a ...
随机推荐
- office2016与visio2016不能“并存”的问题分析
现象: 先安装了office2016专业增强版,再安装visio2016时出现提示 搜集了相关资料,可以通俗的理解为:已经安装了离线客户端版的office后,不能再安装在线版visio. 之后,将of ...
- 梦想还是要有的-纪念正式成为csdn博客专家暨年中总结
csdn博客:http://blog.csdn.net/tuzongxun 我的csdn历程(坚持总会有收获): 一年零三个月之前,2015年3月3日,我在csdn写下第一篇技术博客,只是记录了一 ...
- PHP中include和require的区别详解
1.概要 require()语句的性能与include()相类似,都是包括并运行指定文件.不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估:而对于require()来说, ...
- 使用delphi+intraweb进行微信开发1~4代码示例
前几讲重点阐述的是使用iw进行微信开发的技术难点及解决方法,提供的都是代码片段(微信消息加解密是完整代码),实际上我始终感觉按照教程实作是掌握一门技术的最重要的方法!不过对于刚刚接触这类开发的朋友来说 ...
- nginx入门
1. 前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Ngi ...
- EasyUI DataGrid 分页实现示例
使用easyui可以很方便的开发web程序,这儿仅展示一个后台使用mvc来实现分页的示例,截图如下 示例代码如下 1. 创建模型类,代码如下 using System; using System.Co ...
- AX7: CREATE AN AUTOMATED TEST PACKAGE\MODEL
AX7: CREATE AN AUTOMATED TEST PACKAGE\MODEL It’s really important for a stable solution the use of a ...
- Java Socket编程
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- 登录式与非登录式&交互式与非交互式shell及其环境初始化过程
交互式shell和非交互式shell(interactive shell and non-interactive shell) 交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的 ...
- pkg-config
可以使用pkg-config获取的库需要有一个条件,那就是要求库的提供者,提供一个.pc文件.比如gtk+-2.0的pc文件内容如下: prefix=/usrexec_prefix=/usrlibdi ...