C# List数据批量更新

来源:互联网 发布:企业级sas软件多少钱 编辑:程序博客网 时间:2024/06/12 23:43

针对单条数据一般都是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 @RowCount=@@ROWCOUNT;

        COMMIT TRANSACTION
    SELECT @RowCount AS RowsCount;
           END

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

0 0