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. Hbase数据导入导出

    平时用于从生产环境hbase到导出数据到测试环境. 导入数据: import java.io.BufferedReader; import java.io.File; import java.io.F ...

  2. eclipse插件

    #eclipse market http://www.eclipse.org/mpc/archive.php http://download.eclipse.org/mpc/mars/ #文件路径 p ...

  3. xml保存基本信息

    public static string getXML(string nodeName) { string strReturn = ""; try { string fileNam ...

  4. 自己写的基于bootstrap风格的弹框插件

    自己写的一款基于bootstrap风格的弹框插件,暂时只有确认框.提示框.后续功能扩展.bug修改再更新. ;(function($){ //默认参数 var PARAMS; var DEFAULTP ...

  5. 使用Junit对Spring进行单元测试实战小结

    Demo代码: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:/ ...

  6. css属性在各种浏览器上的兼容性

    transform:在360急速浏览器不支持,在IE兼容性上看IE浏览器的版本,IE9+是支持.

  7. C++ vector erase函数的使用注意事项

    最近使用了顺序容器的删除元素操作,特此记录下该函数的注意事项. 在C++primer中对c.erase(p) 这样解释的:  c.erase(p)    删除迭代器p所指向的元素,返回一个指向被删元素 ...

  8. SharePoint 2013 SP1发布了

    好消息,SharePoint 2013 SP1终于发布了: SP1说明:http://support.microsoft.com/kb/2880552 下载页面:http://www.microsof ...

  9. 入手《C#入门经典(第6版)》,据说今天是读书日

    亚马逊上买的,75.3RMB,放进心愿单那么久都没人送我,太杯具了.为了表扬自己学习完前7章内容,提高后面的学习效率和质量,果断入手,嘿嘿. 预防自己买了书就不看的毛病,下定决心,每天阅读2-3小时. ...

  10. UNIX网络编程-非阻塞connect和非阻塞accept

    1.非阻塞connect 在看了很多资料之后,我自己的理解是:在socket发起一次连接的时候,这个过程需要一段时间来将三次握手的过程走完,如果在网络状况不好或者是其他的一些情况下,这个过程需要比较长 ...