sqlserver数据库批量新增修改类
MSSql Server 数据库批量操作
需要引用的命名空间
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.Text;
类源码:
/// <summary>
/// sqlserver数据库批量新增修改类
/// </summary>
public static class SqlBulkHelper
{
#region 数据库连接字符串
/// <summary>
/// 数据库连接字符串
/// </summary>
public static readonly string ConnString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
#endregion #region SqlBulkCopy方式批量新增数据
/// <summary>
/// SqlBulkCopy方式批量新增数据
/// </summary>
/// <typeparam name="T">对象</typeparam>
/// <param name="modelList">实体类集合</param>
/// <param name="destinationTableName">目标表明</param>
/// <param name="removeColumns">移除的字段列集合</param>
/// <param name="bulkCopyTimeout">超时时间</param>
public static void BulkCopy<T>(List<T> modelList, string destinationTableName, List<string> removeColumns = null, int? bulkCopyTimeout = null)
{
if (string.IsNullOrEmpty(destinationTableName))
{
destinationTableName = typeof(T).Name;
}
var dt = ListToDataTable(modelList);
if (removeColumns != null && removeColumns.Count > 0)
{
foreach (var item in removeColumns)
{
dt.Columns.Remove(item);
}
}
using (SqlConnection conn = new SqlConnection(ConnString))
{
using (var sbc = new SqlBulkCopy(conn))
{
sbc.BatchSize = modelList.Count;
sbc.DestinationTableName = destinationTableName;
sbc.BulkCopyTimeout = bulkCopyTimeout ?? 300;
conn.Open();
sbc.WriteToServer(dt);
}
}
}
#endregion #region SqlBulkCopy方式批量修改数据
/// <summary>
/// SqlBulkCopy方式批量修改数据
/// </summary>
/// <typeparam name="T">对象</typeparam>
/// <param name="modelList">实体类集合</param>
/// <param name="onRelations">关联字段</param>
/// <param name="destinationTableName">目标表名</param>
/// <param name="removeColumns">移除的字段列集合</param>
/// <param name="UpdateColumns">更新的字段集合,不填则全部</param>
public static void BatchUpdate<T>(List<T> modelList, string onRelations, string destinationTableName = null, List<string> removeColumns = null, List<string> UpdateColumns = null)
{
if (string.IsNullOrEmpty(destinationTableName))
destinationTableName = typeof(T).Name.Replace("EN", "");
var dt = ListToDataTable(modelList);
if (removeColumns != null && removeColumns.Count > 0)
{
foreach (var item in removeColumns)
{
dt.Columns.Remove(item);
}
}
var sbUpdateColumns = new StringBuilder();
var columnsIndex = 0;
//只更新某字段
if (UpdateColumns != null && UpdateColumns.Count > 0)
{
foreach (var updateColumn in UpdateColumns)
{
if (columnsIndex > 0)
{
sbUpdateColumns.Append(", ");
}
sbUpdateColumns.AppendFormat("T.{0} = Tmp.{0}", updateColumn);
columnsIndex++;
}
}
else
{
//更新全部字段
for (var i = 0; i < dt.Columns.Count; i++)
{
var colname = dt.Columns[i];
if (colname.ColumnName != onRelations)
{
if (columnsIndex > 0)
{
sbUpdateColumns.Append(", ");
}
sbUpdateColumns.AppendFormat("T.{0} = Tmp.{0}", colname.ColumnName);
columnsIndex++;
}
}
} string sbOnRelation = string.Format("T.{0} = Tmp.{1}", onRelations, onRelations);
var tempTableName = @"#Temp" + destinationTableName;
var createtempsql = string.Format("select * into {0} from {1} where 1=2", tempTableName, destinationTableName);
var updatesql = string.Format("UPDATE T SET {0} FROM {1} T INNER JOIN {2} Tmp ON {3}; DROP TABLE {2};", sbUpdateColumns.ToString(), destinationTableName, tempTableName, sbOnRelation.ToString()); using (SqlConnection conn = new SqlConnection(ConnString))
{
using (SqlCommand command = new SqlCommand("", conn))
{
try
{
conn.Open();
command.CommandText = createtempsql;
command.ExecuteNonQuery();
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
{
bulkcopy.BulkCopyTimeout = 300;
bulkcopy.DestinationTableName = tempTableName;
bulkcopy.WriteToServer(dt);
bulkcopy.Close();
} command.CommandTimeout = 300;
command.CommandText = updatesql;
int countQuery = command.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine("BatchUpdate:{0}表失败,原因:{1}", destinationTableName, ex.Message + ex.StackTrace);
// Handle exception properly
}
finally
{
//stopwatch.Stop();
//Console.WriteLine("更新耗时:{0}",stopwatch.ElapsedMilliseconds);
//list.Clear();
conn.Close();
}
}
}
}
#endregion #region
/// <summary>
/// //list转化为table
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entitys"></param>
/// <returns></returns>
public static DataTable ListToDataTable<T>(List<T> entitys)
{ //检查实体集合不能为空
if (entitys == null || entitys.Count < 1)
{
return new DataTable();
} //取出第一个实体的所有Propertie
Type entityType = entitys[0].GetType();
PropertyInfo[] entityProperties = entityType.GetProperties(); //创建传入对象名称的列
//生成DataTable的structure
//生产代码中,应将生成的DataTable结构Cache起来,此处略
DataTable dt = new DataTable("dt");
for (int i = 0; i < entityProperties.Length; i++)
{
dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);
//dt.Columns.Add(entityProperties[i].Name);
} //将所有entity添加到DataTable中
foreach (object entity in entitys)
{
//检查所有的的实体都为同一类型
if (entity.GetType() != entityType)
{
throw new Exception("要转换的集合元素类型不一致");
}
object[] entityValues = new object[entityProperties.Length];
for (int i = 0; i < entityProperties.Length; i++)
{
entityValues[i] = entityProperties[i].GetValue(entity, null);
}
dt.Rows.Add(entityValues);
}
return dt;
}
#endregion
}
sqlserver数据库批量新增修改类的更多相关文章
- 基于EasyCode定制Mybatisplus全自动单表实现:新增/批量新增/修改/批量删除/分页查询/ID查询
基于EasyCode定制Mybatisplus全自动单表实现CRUD接口 分页查询 ID查询 新增 批量新增 修改 批量删除 注意使用了MybatisPlus的自动填充功能,和insertBatchS ...
- 针对SQLServer数据库的通用访问类
Web.config中代码 <configuration> <connectionStrings> <add name="connString" co ...
- [C#]记录一次异常排查,关于using语法、sqlserver数据库session、DBHelper类
最近在做一个基于asp.net和sqlserver的网站项目,发现网站运行一段时间之后,会报异常: 超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小 ...
- sqlserver数据库批量插入-SqlBulkCopy
当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时.我使用了两种方式: 每次插入数据时,都只插入一条数据库,这个会导致每 ...
- 基于JQuery easyui,gson的批量新增/修改和删除-servlet版
最近项目需要用到在页面进行批量操作,做了一些这方面的学习,参照网上的资料写了个小例子,记录一下: 准备 引入gson-2.6.2.jar,这里使用gson而不使用json-lib,原因是json-li ...
- oracle 数据库更新 新增 修改 删除
数据增加 INSERT INTO 表名称 [(字段,字段,...)] VALUES (值,值,...) ; 考虑到日后代码的可维护性,一定要使用完整的语法进行数据的增加. 数据修改 UPDATE 表名 ...
- C# 连接SQLServer数据库自动生成model类代码
Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading ...
- C# 数据库批量插入数据之 —— SqlBulkCopy、表值参数
创建了一个用来测试的Student表: CREATE TABLE [dbo].[Student]( [ID] [int] PRIMARY KEY NOT NULL, ) NULL, ) NULL, [ ...
- SqlServer批量压缩数据库日志-多数据库批量作业,批量备份还原
原文:SqlServer批量压缩数据库日志-多数据库批量作业,批量备份还原 --作业定时压缩脚本 多库批量操作 DECLARE @DatabaseName NVARCHAR(50) DECLARE @ ...
- 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor
批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...
随机推荐
- 机器学习模型评价指标之ROC 曲线、 ROC 的 AUC 和 投资回报率
前文回顾: 机器学习模型评价指标之混淆矩阵 机器学习模型评价指标之Accuracy.Precision.Recall.F-Score.P-R Curve.AUC.AP 和 mAP 1. 基本指标 1. ...
- phpword 模板文件导出word到服务器 并浏览器下载
模板文件填充 然后生成新文件 //调用PHPwordrequire_once(ROOTPATH . "inc/vendor/autoload.php"); $phpWord = n ...
- i春秋SQLi
打开题目网页是个很简单的登录网页 先查看源码,抓包 都没找到可用的信息 依我所见这里应该就是一个注入 但是怎么输入都会回显username错误 直到输入admin 尝试admin# Admin'# ...
- SSH SCP 使用秘钥验证 登录
从Win10连接到Ubuntu 22.04. 1. Win10 上生成秘钥公钥 ssh-keygen -t rsa -C "xxx@yyy.com" 2. Ubuntu 22.04 ...
- 关于deepin-wine或wine更换字体方法
前言 首先要知道,deepin-wine打包的QQ和你自己用 deepin-wine跑的windows软件,他们所在不是同一个容器 deepin打包QQ所在的容器,在你的 ~/.deepinwine ...
- day07 方法重写&super、this、static关键字&JVM的类加载顺序题目
day07 方法重写 1)重写发生在子父类当中 2)方法名.参数列表.返回值均相同 3)重写的方法,方法体或者访问控制修饰符不同 4)子类方法的访问权限不能缩小,比如父类是int,子类重写权限不能是b ...
- 【JVM调优】Day02:CMS的三色标记算法、分区的G1回收器、短时停顿的ZGC回收器
一.CMS及其三色标记算法 1.核心 标记整个图谱的过程分为多步 多个线程相互工作,才能标记完 标记的算法,JVM虚拟机.go语言使用的都是三色标记算法 2.含义 从那个地方开始,用三种颜色替代 一开 ...
- python 之列表(list)处理
列表(list) 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可,一个列表中的数据类型可以各不相同,可以同时分别为整数.实数.字符串等基本类型,甚至是列表.元组.字典.集合以及其他自定 ...
- 第五篇:前端之JQuery
jQuery快速入门 jQuery jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events ...
- Redis set数据类型命令使用及应用场景使用总结
转载请注明出处: 目录 1.sadd 集合添加元素 2.srem移除元素 3.smembers 获取key的所有元素 4.scard 获取key的个数 5.sismember 判断member元素是否 ...