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数据库批量新增修改类的更多相关文章

  1. 基于EasyCode定制Mybatisplus全自动单表实现:新增/批量新增/修改/批量删除/分页查询/ID查询

    基于EasyCode定制Mybatisplus全自动单表实现CRUD接口 分页查询 ID查询 新增 批量新增 修改 批量删除 注意使用了MybatisPlus的自动填充功能,和insertBatchS ...

  2. 针对SQLServer数据库的通用访问类

    Web.config中代码 <configuration> <connectionStrings> <add name="connString" co ...

  3. [C#]记录一次异常排查,关于using语法、sqlserver数据库session、DBHelper类

    最近在做一个基于asp.net和sqlserver的网站项目,发现网站运行一段时间之后,会报异常: 超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小 ...

  4. sqlserver数据库批量插入-SqlBulkCopy

    当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时.我使用了两种方式: 每次插入数据时,都只插入一条数据库,这个会导致每 ...

  5. 基于JQuery easyui,gson的批量新增/修改和删除-servlet版

    最近项目需要用到在页面进行批量操作,做了一些这方面的学习,参照网上的资料写了个小例子,记录一下: 准备 引入gson-2.6.2.jar,这里使用gson而不使用json-lib,原因是json-li ...

  6. oracle 数据库更新 新增 修改 删除

    数据增加 INSERT INTO 表名称 [(字段,字段,...)] VALUES (值,值,...) ; 考虑到日后代码的可维护性,一定要使用完整的语法进行数据的增加. 数据修改 UPDATE 表名 ...

  7. C# 连接SQLServer数据库自动生成model类代码

    Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading ...

  8. C# 数据库批量插入数据之 —— SqlBulkCopy、表值参数

    创建了一个用来测试的Student表: CREATE TABLE [dbo].[Student]( [ID] [int] PRIMARY KEY NOT NULL, ) NULL, ) NULL, [ ...

  9. SqlServer批量压缩数据库日志-多数据库批量作业,批量备份还原

    原文:SqlServer批量压缩数据库日志-多数据库批量作业,批量备份还原 --作业定时压缩脚本 多库批量操作 DECLARE @DatabaseName NVARCHAR(50) DECLARE @ ...

  10. 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor

    批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...

随机推荐

  1. 实现Swaggera的在线接口调试

    1.访问Swagger的路径是:http://localhost:8080/swagger-ui.html 如果项目正常,则可看到如下界面: 2.点开下面的随意一个方法 如add添加数据的方法,展开: ...

  2. 浏览器直接修改网站的js代码

    1.按下F12打开控制台,找到源代码,然后是替换 2.在本地创建一个文件夹,会提示风险,点击允许 3.再找到你要修改的js文件代码,右击选择保存并覆盖 这样代码会保存到你刚刚创建的本地文件夹当中,接着 ...

  3. Redis的常见应用场景

    缓存.分布式数据共享.setnx分布式锁.incrby全局id进行分库分表.计数器.限流(ip为key,计数超过阈值则返回false).购物车(hash,用户key-商品field-数量value). ...

  4. Backbone 网络-ResNet v2 详解

    目录 目录 目录 前言 摘要 1.介绍 2.深度残差网络的分析 3.On the Importance of Identity Skip Connection 4.On the Usage of Ac ...

  5. QT+VS 调用基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案

    方案一.基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案 首先上博客:Windows下Qt生成dump文件并定位bug(基于qBreakpad) 这个地方使用的是一个叫qBreakP ...

  6. RabbitMQ、RocketMQ、Kafka延迟队列实现

    延迟队列在实际项目中有非常多的应用场景,最常见的比如订单未支付,超时取消订单,在创建订单的时候发送一条延迟消息,达到延迟时间之后消费者收到消息,如果订单没有支付的话,那么就取消订单. 那么,今天我们需 ...

  7. 用 while 生成猜数字

    import java.util.Random; import java.util.Scanner; public class zy2 { public static void main(String ...

  8. 2022i春秋-冬季赛nan’s analysis

    下载附件,在tcp的0流可以看到一个keyisChunqiuGame00504 在3流处得到压缩包,密码不是上面那个,后面对附件找了几个小时都没发现压缩包密码,我是笨比.后面才看到有在线环境. 然后找 ...

  9. “喜提”一个P2级故障—CMSGC太频繁,你知道这是什么鬼?

    大家好,我是陶朱公Boy. 背景 今天跟大家分享一个前几天在线上碰到的一个GC故障- "CMSGC太频繁". 不知道大家看到这条告警内容后,是什么感触?我当时是一脸懵逼的,一万个为 ...

  10. .NET周报【1月第1期 2023-01-06】

    国内文章 [开源]基于.net6+gtksharp实现的Linux下的图形界面串口调试工具 https://www.cnblogs.com/flykai/p/17007554.html 由于公司的上位 ...