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支持)的更多相关文章

  1. Cassandra使用pycassa批量导入数据

    本周接手了一个Cassandra系统的维护工作,有一项是需要将应用方的数据导入我们维护的Cassandra集群,并且为应用方提供HTTP的方式访问服务.这是我第一次接触KV系统,原来只是走马观花似的看 ...

  2. csv文件批量导入数据到sqlite。

    csv文件批量导入数据到sqlite. 代码: f = web.input(bs_switch = {})  # bs_switch 为from表单file字段的namedata =[i.split( ...

  3. 使用python向Redis批量导入数据

    1.使用pipeline进行批量导入数据.包含先使用rpush插入数据,然后使用expire改动过期时间 class Redis_Handler(Handler): def connect(self) ...

  4. Redis批量导入数据的方法

    有时候,我们需要给redis库中插入大量的数据,如做性能测试前的准备数据.遇到这种情况时,偶尔可能也会懵逼一下,这里就给大家介绍一个批量导入数据的方法. 先准备一个redis protocol的文件( ...

  5. 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库

    将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...

  6. 批量导入数据到mssql数据库的

    概述 批量导入数据到数据库中,我们有好几种方式. 从一个数据表里生成数据脚本,到另一个数据库里执行脚本 从EXCEL里导入数据 上面两种方式,导入的数据都会生成大量的日志.如果批量导入5W条数据到数据 ...

  7. asp.net线程批量导入数据时通过ajax获取执行状态

    最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入sessi ...

  8. 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 ...

  9. asp.net 线程批量导入数据,ajax获取执行状态

    最近做了一个批量导入功能,长时间运行,没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过a ...

随机推荐

  1. Eclipse几个版本号的区别

    查看Eclipse的版本号: 1. 找到eclipse安装目录 2. 进入readme文件夹,打开readme_eclipse.html 3. readme_eclipse.html呈现的第二行即数字 ...

  2. web api 开发记录

    1. 修改 api 返回时间格式 //配置返回的时间类型数据格式 GlobalConfiguration.Configuration.Formatters.JsonFormatter.Serializ ...

  3. Kafka集群配置说明

    #kafka数据的存放地址,多个地址的话用逗号分 log.dirs=/tmp/kafka-logs #broker server服务端口 port=9092 #这个参数会在日志segment没有达到l ...

  4. day4 函数

    面向对象:-->类-->class面向过程:-->过程-->def函数式编程:-->函数-->def 函数是逻辑结构化和过程化的一种编程方法 使用函数的三大优点:减 ...

  5. 让一个端口同时做两件事:http/https和ssh

    相信很多人都在YY:能不能让80端口分析连接协议,如果是http协议就让服务器交给http服务程序(如Apache.Nginx等)处理,如果是ssh协议就交给ssh服务程序(如OpenSSH Serv ...

  6. Microsoft Visual Studio has encountered a problem

    VS 2010 断点调试的时候,一运行到断点就报这个错误"Visual Studio has encountered a problem and needs to close", ...

  7. inux grep 命令 搜索含有"zynq"字符的文件

    使用命令grep -rl 'zynq' /work/xilinx/u-boot-xlnx-master (有引号)-r 选项表示递归(recursive)遍历所有子目录-l 选项表示只列出文件名 /w ...

  8. New Begin--工作一年所思所感小记

    有段日子没有更新Blog了,这段时间过得有些散漫,今天看完了两本书,感触颇多,让我繁杂的心绪又重归平静,想写一些什么,遂有了这篇文章. 所谓的一年是从13年7月9日我正是入职算起,到现在为止一年有余, ...

  9. Java多线程之并发协作生产者消费者设计模式

    两个线程一个生产者个一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性.常用的同步方法是采用标 ...

  10. nginx入门

    1.   前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Ngi ...