方法一:使用SqlBulkCopy实现批量更新或添加数据。

SqlBulkCopy类一般只能用来将数据批量插入打数据库中,如果数据表中设置了主键,出现重复数据的话会报错,如果没有设置主键,那么将会添加同样的数据,导致数据重复。这里有两种方案可实行方案,实现批量将数据更新到数据表中。如果数据存在,就更新数据;如果不存在,则添加一条新的数据

这两种方案都需要添加一个新的用作临时存储数据的表,假如有两个表 BatchTableTemp和BatchTable, SqlBulkCopy类先批量将数据添加到BatchTableTemp中,然后再将BatchTable表中不存在的数据添加到BatchTable表中,存在的数据更新到BatchTable表中

方案一:在执行完SqlBulkCopy批量将数据添加到BatchTableTemp以后,执行存储过程,BatchTable表中不存在的数据就添加Insert,存在的数据更新Update

SqlHelper代码:

//<summary>
//返回操作影响的行数
//</summary>
public static int ExcuteNonQuery( CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{
SqlCommand cmd = PrepareSqlCommand(cmdType, cmdText, cmdParms);
int value = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.Connection.Close();
return value;
} /// <summary>
/// 批量添加数据
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static bool ExcuteNonQuery(DataTable dt)
{
SqlConnection connection = new SqlConnection(connString);
connection.Open();
SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connection);
sqlbulkcopy.BulkCopyTimeout = ; //超时之前操作完成所允许的秒数
sqlbulkcopy.BatchSize = dt.Rows.Count; //每一批次中的行数
sqlbulkcopy.DestinationTableName = dt.TableName; //服务器上目标表的名称
for (int i = ; i < dt.Columns.Count; i++)
{
sqlbulkcopy.ColumnMappings.Add(i, i); //映射定义数据源中的列和目标表中的列之间的关系
}
sqlbulkcopy.WriteToServer(dt); // 将DataTable数据上传到数据表中
connection.Close();
return true;
}

C#执行ExcuteNonQuery(),批量添加到BatchTableTemp,然后在执行存储过程代码

DataTable table = GetDataTable("BatchTableTemp"); //获取要更新的DataTable
bool value = SqlHelper.ExcuteNonQuery(table);
if (value)
{
SqlHelper.ExcuteNonQuery(CommandType.StoredProcedure, "InsertOrUpdate", null);
}

将BatchTableTemp同步更新到BatchTable表中的存储过程代码:

ALTER procedure [dbo].[InsertOrUpdate]
as
begin
update BatchTable
set BatchTable.Column1=BatchTableTemp.Column1,
BatchTable.Column2=BatchTableTemp.Column2,
BatchTable.Column3=BatchTableTemp.Column3,
BatchTable.Column4=BatchTableTemp.Column4,
BatchTable.Column5=BatchTableTemp.Column5
from BatchTable,BatchTableTemp
where BatchTable.Gradation=BatchTableTemp.Gradation insert into BatchTable
select * from BatchTableTemp
where not exists
(select Gradation from BatchTable where BatchTable.Gradation=BatchTableTemp.Gradation)
delete BatchTableTemp
end

方案二:待续

方法二:利用表值参数(简称TVPS)批量更新(或插入)数据

待续

.Net中批量更新或添加数据的更多相关文章

  1. ADO.NET - 批量更新或添加数据

    方法一:使用SqlBulkCopy实现批量更新或添加数据. SqlBulkCopy类一般只能用来将数据批量插入打数据库中,如果数据表中设置了主键,出现重复数据的话会报错,如果没有设置主键,那么将会添加 ...

  2. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  3. Myabtis中批量更新update多字段

    在mybatis中批量更新多个字段 推荐使用如下操作: 方式1:在Dao层接口中: void updateBatch(@Param("list")List<Student&g ...

  4. 从源码的角度看 React JS 中批量更新 State 的策略(下)

    这篇文章我们继续从源码的角度学习 React JS 中的批量更新 State 的策略,供我们继续深入学习研究 React 之用. 前置文章列表 深入理解 React JS 中的 setState 从源 ...

  5. mybatis中批量更新的问题

    问题:使用mybatis在执批量更新操作时,一直报错执行失败 解决方法: 首先打印了SQL语句,发现SQL语句拿出来执行没问题,也可以批量执行.SQL没问题,应该是配置的问题. 在网上查询和很多资料, ...

  6. hibernate批量更新和删除数据

    批量处理  不建议用Hibernate,它的insert效率实在不搞,不过最新版本的Hibernate似乎已经在批量处理的时候做过优化了,设置一些参数如batch_size,不过性能我没有测试过,听说 ...

  7. 批量更新mysql表数据

    1.批量更新表中某个字段,如果表比较大,每条记录都执行一条update,1s执行10条数据,10万条数据就要1W秒,3个多小时. 2.可以用case when 来实现,模板如下 UPDATE cate ...

  8. 批量插入一张表的数据,并且生成不同的uuid 字符截取 批量更新 去除重复数据

    INSERT INTO party_branchSELECT UUID(),m.name,m.secreta_name,m.contacts_name,m.contact_phon,m.categor ...

  9. mysql批量update更新,mybatis中批量更新操作

    在日常开发中,有时候会遇到批量更新操作,这时候最普通的写法就是循环遍历,然后一条一条地进行update操作.但是不管是在服务端进行遍历,还是在sql代码中进行遍历,都很耗费资源,而且性能比较差,容易造 ...

随机推荐

  1. 菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)

    俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔.对复杂的nginx而言,main函数就是“牛之鼻”,只要能理清main函数,就一定能理解其中 ...

  2. JBehave

    JBehave 上篇我们说到如何从Github上clone出一个JBehave项目,既是为了学习JBehava,也是为了熟悉下Github.从clone下来的项目看来,基本没什么问题,稍微捋一捋就可以 ...

  3. centos安装wget 及配置(转)

    yum -y install wget #yum install perl Searching for GCC... The path "" is not valid path t ...

  4. 一个sql的优化

    原文:一个sql的优化 目的:为了查询某天某个服务器上的登录id的个数   刚开始编写的sql: select count(a.mac) logusers from Log_MacLogin_All ...

  5. jQuery Easy UI Accordion(可伸缩的面板)包

    Accordion 可伸缩的面板组件.基于panel,示为以下的比率: <!doctype html> <html lang="en"> <head& ...

  6. Https 客户端与服务器交互过程梳理(转)

    本文试图以通俗易通的方式介绍Https的工作原理,不纠结具体的术语,不考证严格的流程.我相信弄懂了原理之后,到了具体操作和实现的时候,方向就不会错,然后条条大路通罗马.阅读文本需要提前大致了解对称加密 ...

  7. SAE+Java+jetty

    SAE的java执行环境jetty如servlet该容器,和开放几乎完全访问.有效支持各种jar包.但对于jdk的要件的版本号是非常严格格,这里的版本号是jdk1.6 SAE利用上传war该方式配置j ...

  8. oracle修改表空间

    1.其中表中查找该表空间不正确 select * from dba_tables where tablespace_name='TDB'; 2.将表空间在 TDB 中的移到表空间 TDB2009 中 ...

  9. Android微信道共用,没有反应

    研究2日,寻找良好的比较完整的文章一天.发送链接:http://www.apkbus.com/android-138326-1-1.html 然而,按照上面的教程一步一步做.结果点击分享或无反应. 出 ...

  10. 蓝桥杯 BASIC 27 矩阵乘法(矩阵、二维数组)

    [思路]:注意0次幂是单位矩阵. [AC代码]: #include <iostream> #include <algorithm> #include <iomanip&g ...