C# List数据批量更新

针对单条数据一般都是update语句直接更新

例如:update UserTable set UserName=‘小名‘   where userid=xxx

但是如果是针对List数据组进行更新的话不外乎两种

1、程序for、foreach、while循环语句然后多次请求数据库更新(这种在这里不多做解释,因为基本上都知道这种方法)

2、重点说下下面这种方式:通过XML的方式在数据库进行批量的更新

1、建立ListToXML方法

/// <summary>

/// 使用反射把List<T>转换成XmlDocument

/// </summary>

/// <returns></returns>

public static XmlDocument ListToXML<T>(string XmlName,IList<T> IL)

{

try

{

XmlDocument XMLdoc = new XmlDocument();

//建立XML的定义声明

XmlDeclaration XMLdec = XMLdoc.CreateXmlDeclaration("1.0", "utf-8", null);

XMLdoc.AppendChild(XMLdec);

XmlElement Root = XMLdoc.CreateElement(XmlName);

PropertyInfo[] PropertyInfos = typeof(T).GetProperties();

foreach (T item in IL)

{

XmlElement ChildNode = XMLdoc.CreateElement(typeof(T).Name);

foreach (PropertyInfo pro in PropertyInfos)

{

if (pro != null)

{

string KeyName = pro.Name;

string KeyValue = string.Empty;

if (pro.GetValue(item, null) != null)

{

KeyValue = pro.GetValue(item, null).ToString();

}

ChildNode.SetAttribute(KeyName,KeyValue);

ChildNode.InnerText = KeyValue;

}

}

Root.AppendChild(ChildNode);

}

XMLdoc.AppendChild(Root);

return XMLdoc;

}

catch(Exception ex)

{

//LogHelper.LogDebug("List<T>生成XML失败:" + ex.Message);

return null;

}

}

2、将写好的XMl直接当作参数@Data传入存储过程

public  int UpdateAdminUsers(IList<AdminUserInfo> adminUsers)

{

SqlParameter[] param = new SqlParameter[1];

//拼接xml

string data = XMLHelper.ListToXML<AdminUserInfo>("AdminUserList", adminUsers).InnerXml.Replace("encoding=\"utf-8\"", "");

param[0] = new SqlParameter("@Data", data);

object o = SqlHelper.ExecuteScalar(DataHelper.ConnectionString, CommandType.StoredProcedure, "USP_AdminUsersUpdate", param);

return Convert.ToInt32(o);

}

3、数据库的分析XMl然后进行数据的处理

Create PROCEDURE [dbo].[USP_AdminUsersUpdate]
       @Data XML
         AS
         BEGIN

         SET XACT_ABORT ON;
     BEGIN TRANSACTION
            DECLARE @RowCount AS INT=0;
        DECLARE @AdminUserList TABLE(
         [UserId] [int] NOT NULL,
             [UserName] [nvarchar](50) NULL
          );
        
        
         INSERT @AdminUserList (UserId ,UserName )
             SELECT T.c.value(‘@UserId‘,‘int‘) as UserId,
             T.c.value(‘@UserName‘,‘nvarchar(50)‘) as UserName
             FROM @Data.nodes(‘AdminUserList/AdminUserInfo‘) T(c);
        
         INSERT dbo.AdminUser ( UserId , UserName  )
            SELECT  UserId ,UserName FROM @AdminUserList;

SET @[email protected]@ROWCOUNT;

        COMMIT TRANSACTION
    SELECT @RowCount AS RowsCount;
           END

        这种更新方式是将我们数据写成XML有效避免了参数无限次的输入

时间: 2024-08-27 11:33:45

C# List数据批量更新的相关文章

mybatis数据批量更新

原sql语句: update zyjd set peopleId=case when id=1 then   10, when id=2 then   11 end, roadgridid =case when id=1 then   101, when id=2 then   102 end, ---- where id=1 or id=2 sql意思:当id=1的情况下peopleId =10,roadgridid =101,当id=2的情况下peopleId =11,roadgridid 

thinkphp对180万数据批量更新支持事务回滚

目前测试180万多的数据,大概是正常的,不知道再多了会怎么样了我们要给表改成 innodb类型 干货来了: set_time_limit(0); ini_set("memory_limit","800M");//180万数据  数据越多越消耗内存 $t1 = microtime(true); $Model = M('orderlisttest');//先用 M 函数实例化一个空对象 $rr['goods_tuihuo']=1; $subQuery = $Model-

Sql Server数据批量更新

UPDATE S SET S.[name]=T.[name],S.[sch_id]=T.[sch_id],S.[sex]=T.[sex],S.[isOk]=T.[isOk] FROM [Student] S INNER JOIN ( SELECT '1010' AS id,'小妹1130946325' AS name,'2' AS sch_id,'gril' AS sex,0 AS isOk UNION ALL SELECT '1011' AS id,'小子1130946325' AS name

Neo4j 第五篇:批量更新数据

相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时,大多数时间耗费在连接数据库和打开事务上,高效的做法是利用Neo4j提供的参数(Parameter)机制和UNWIND子句:在一次数据更新中,进行一次连接,打开一次事务,批量更新数据:参数用于提供列表格式的数据,UNWIND子句是把列表数据展开成一行一行的数据,每行数据都会执行结构相同的Cypher

mybatis学习之路----批量更新数据两种方法效率对比

原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql:

MySQL批量更新不同表中的数据

今天翻到以前写的批量更新表中的数据的存储过程,故在此做一下记录. 当时MySQL中的表名具有如下特征,即根据需求将业务表类型分为了公有.私有和临时三种类型,即不同的业务对应三张表,而所做的是区分出是什么类型(公有.私有.临时)的业务表对数据的固定字段做统一规律的处理. 下面为当时所编写的存储过程: BEGIN DECLARE done INT; DECLARE v_table_name VARCHAR(100); DECLARE v_disable VARCHAR(100); DECLARE v

Sql语句批量更新数据(多表关联)

最近在项目中遇到一个问题,原来设计的功能是不需要一个特定的字段值depid的,但是新的功能需要根据depid来展现,于是出现了这样一个问题,新增加的数据都有正确的depid,而原来的大量的数据就没有depid或者说depid不是想要的,面临要批量更新原来数据depid的问题. 更新涉及到三个表base_cooperativeGroup,base_groupuser,base_user. 列出表结构: 1.base_cooperativeGroup 2.base_groupuser 3.base_

SQL快速操作技巧2_datatable批量更新到数据表

(为了给您节省时间,您可以只看高亮部分内容) 要将datatable 批量更新到数据表其实是两步: (1)将datatable快速存入一个表中: (2)根据一个数据表更新另外一个数据表: 下面细说: (1)将datatable快速存入一个表中: 1)   insert循环插入:2)   sqldataadapter.update(dataset,tablename);3)   sqlbulkcopy.WriteToServer(datatable); 1.生成测试的datatable表,表结构如

Mybatis批量更新数据

Mybatis批量更新数据 第一种方式 [html] view plain copy print? <update id="updateBatch" parameterType="Map"> update aa   set a=#{fptm}, b=#{csoftrain} where c in <foreach collection="cs" index="index" item="item&qu