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. Best Practices for Performance_4.Optimizing Battery Life 获取充电状态、电池信息,"sticky"类型的广播

    http://developer.android.com/training/monitoring-device-state/index.htmlhttp://developer.android.com ...

  2. Linux命令(22)find的使用

    在linux下面工作,有些命令能够大大提高效率. 比如说find命令,他哥俩可以算是必会的linux命令,几乎每天都要用到他们. find命令 find命令的一般形式 find命令的常用选项及实例 f ...

  3. c++中的宏 #define _CLASSDEF(name) class name

    #include <iostream> using namespace std; #define _CLASSDEF(name) class name; \ typedef name * ...

  4. 实体写到redis写不进去--误把类当成实体类

    之前一直都把实体写入redis都没有问题,今天再次这样干,结果却是怎么写都写不进去,redis里的值老是为空 最后才发现把类当成了实体类,当然写不进去了. 把类: /// <summary> ...

  5. web页面设计基本原则

    1.对齐. 不对齐看起来糟糕极了.简直一片混乱,会给人一种很不专业的印象.对齐让页面更漂亮一些,更重要的是便于更好的传达信息. 2.去掉糟糕的边框.边框会产生一种分离感. 3.亲密性. 元素相互靠近看 ...

  6. 新做的一个基于OPENGL的gui库

    #include <BGE/All> ,text);     button->setName(name);     button->setSize(Vector2f(,)); ...

  7. 基于JS功能强大的日期插件Kalendae

    开发中需要一个日期插件,可以在zepto下使用,可以选择日期段,可以设置不可选日期 找到一个完全满足的,并且基于JS不依赖于任何库. 在线演示:http://chipersoft.com/Kalend ...

  8. Python-9 函数

    #1 内建函数 乘方:pow() >>> pow(2,3) 8 >>> 取绝对值:abs() >>> abs(-1) 1 >>> ...

  9. MsSql数据库存储过程加密解密

    -------------------------------------------------------------------------------- ------------------- ...

  10. springMVC发送邮件

    springMVC发送邮件 利用javax.mail发送邮件,图片与附件都可发送 1,Controller类 package com.web.controller.api; import javax. ...