EF中使用SqlBulkCopy
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YX.Entity; namespace YX.DAL.Extenstions
{
public static class SqlBulkCopyHelper
{
public static void BulkInsertAll<T>(IEnumerable<T> entities)
{
entities = entities.ToArray();
var cons = new Sam_DBEntities();
string cs = cons.Database.Connection.ConnectionString;
var conn = new SqlConnection(cs);
conn.Open(); Type t = typeof(T); var bulkCopy = new SqlBulkCopy(conn)
{
DestinationTableName = t.Name
}; var properties = t.GetProperties().Where(EventTypeFilter).ToArray();
var table = new DataTable(); foreach (var property in properties)
{ Type propertyType = property.PropertyType;
if (propertyType.IsGenericType &&
propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
propertyType = Nullable.GetUnderlyingType(propertyType);
} table.Columns.Add(new DataColumn(property.Name, propertyType));
} foreach (var entity in entities)
{ table.Rows.Add(properties.Select(
property => GetPropertyValue(
property.GetValue(entity, null), property.PropertyType.Name)).ToArray());
}
foreach (DataColumn dc in table.Columns)
{
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(dc.ColumnName, dc.ColumnName));
}
bulkCopy.WriteToServer(table); conn.Close();
} private static bool EventTypeFilter(System.Reflection.PropertyInfo p)
{
var attribute = Attribute.GetCustomAttribute(p,
typeof(AssociationAttribute)) as AssociationAttribute; if (attribute == null) return true;
if (attribute.IsForeignKey == false) return true; return false;
} private static object GetPropertyValue(object o, string type)
{
if (o == null)
{
return DBNull.Value;
} return o;
}
}
}
今天使用SqlBulkCopy时,一直报错。
错误信息如下
来自数据源的 String 类型的给定值不能转换为指定目标列的类型 datetime。 ---> System.FormatException: 将参数值从 String 转换到 DateTime 失败。 ---> System.FormatException: 该字符串未被识别为有效的 DateTime。
我就开始检查这个表中的时间字段,结果检查了N次之后,发现所有插入表中的DateTime都是正确的。
后来在尝试其他方法后,发现由于我使用的DataTable中未包含自增长的列,加上自增列之后,就正确插入到数据库中了。
分析了一下,应该是列对应错误,
SqlBulkCopy不是根据表的ColumnName来匹配的,而是根据ColumnIndex匹配。所以插入数据的表需要和数据库中表的列名顺序完全一致
如果需要按照ColumnName对应来插入数据,可以指定SqlBulkCopyColumnMapping。代码如下
SqlBulkCopy sbc = new SqlBulkCopy(conPrivate); foreach (DataColumn dc in dt.Columns)
sbc.ColumnMappings.Add(new SqlBulkCopyColumnMapping(dc.ColumnName, dc.ColumnName));
EF中使用SqlBulkCopy的更多相关文章
- EF中的那些批量操作
在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么这篇文章就来总结EF中的那些 ...
- EF中的批量操作
阅读目录 插入 更新 删除 在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么 ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- 2.EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- EF中扩展出Between操作符 (修订版)
随手记录一下,这是针对原文错误的修改. 原文:EF中扩展出Between操作符 直接使用是错误的,修改后的扩展方法: /// <summary> /// 扩展 Between 操作符 // ...
- 如何在EF中实现left join(左联接)查询
在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...
- sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
- EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!
回到目录 Entityframeworks很聪明 不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在lin ...
- DB表的关系及EF中Fluent API的使用
现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...
随机推荐
- vue-echarts数据可视化实现自适应屏幕进行缩放,这个我写了两篇文章,一个用了vue-echarts,一个直接用的charts ,我可真机智 啊~~~
使用这个后可以实现屏幕自适应 效果如下 <template> <div style="width:100%;height:20rem" ref="res ...
- Vue插槽最全最通俗的总结
1.匿名插槽----就是定义的时候不带name的插槽,使用的时候也不用带name 总结: (1)一定要分清定义插槽和使用插槽格式.如上图A是在使用一个插槽的基础上再继续定义一个匿名插槽. (2)匿名插 ...
- NodeJS 实战系列:如何设计 try catch
本文将通过一个 NodeJS 程序里无效的错误捕获示例,来讲解错误捕获里常见的陷阱.错误捕获不是凭感觉添加 try catch 语句,它的首要目的是提供有效的错误排查信息,只有精心设计的错误捕获才有可 ...
- FAQ selenium无法click的一个案例分享(1)
案例描述 http://sahitest.com/demo/php/fileUpload.htm 来自助教咨询 点击网页的第一个选择文件,如图 示例代码 from selenium import w ...
- java执行js脚本
@Test public void aa() throws NoSuchMethodException { String regular = "function regular(args1) ...
- ICSharpCode.SharpZipLib.Zip 解析时报错System.NotSupportedException: No data is available for encoding 936
分析原因 利用ICSharpCode.SharpZipLib.Zip进行APK解析时,因为APK内编译的名称为中文,查询微软开发文档936为gb2312中文编码 微软开发文档地址https://doc ...
- 2 .NET Core笔试题
1.说说在Linux系统部署ASP.NET Core项目的步骤. 2.说说热重载是什么. 3.如何理解鉴权和授权两个词 4.说说.NET7包含了几大方向的开发? 5.如何理解云原生? 6.ASP.NE ...
- 安装redhat6.10 出现的问题
安装redhat6.10 操作系统不定时重启情况说明 曾出现报错如下: 在UEFI模式下安装RHEL6.10,安装完毕后系统第一次重启无法进入操作系统,同时屏幕上出现错误提示: Invalid m ...
- C# Socket 通信时,怎样判断 Socket 双方是否断开连接
参考内容: C#socket通信时,怎样判断socket双方是否断开连接 C#之Socket断线和重连 Socket.Poll 方法 Socket.Blocking 属性 最近需要写个网口通信的上位机 ...
- [清华集训2016] Alice 和 Bob 又在玩游戏
\(\text{Solution}\) 第一道有向图 \(SG\) 函数的博弈论 有根树,设 \(f[x]\) 表示以 \(x\) 为根子树的 \(SG\) 值 对于分裂的图的 \(SG\) 值为每个 ...