首页 > 编程 > .NET > 正文

SqlCommandBuilder类批量更新excel或者CSV数据的方法

2024-07-10 13:29:37
字体:
来源:转载
供稿:网友
这篇文章主要介绍了SqlCommandBuilder类批量更新excel或者CSV数据的方法,需要的朋友可以参考下
 

当你批量操作数据的时候,常常会使用到update table1 from table2的这种方式,这种方式是最简洁的。
但当你从excel或者CSV文件更新海量数据时,再使用这种方法,那性能是不是好?字符串拼接又何其之多,大数据是不是需要分组更新?
我不想去检测各种方法的速度,因为我个人比较认可以下方式,欢迎大家批评与指正。
我需要使用到的类主要是SqlCommandBuilder
 

  1. /// <param name="table">准备更新的DataTable新数据</param> 
  2.   /// <param name="TableName">对应要更新的数据库表名</param> 
  3.   /// <param name="primaryKeyName">对应要更新的数据库表的主键名</param> 
  4.   /// <param name="columnsName">对应要更新的列的列名集合</param> 
  5.   /// <param name="limitColumns">需要在SQL的WHERE条件中限定的条件字符串,可为空。</param> 
  6.   /// <param name="onceUpdateNumber">每次往返处理的行数</param> 
  7.   /// <returns>返回更新的行数</returns> 
  8.   public static int Update(DataTable table, string TableName, string primaryKeyName, string[] columnsName, string limitWhere,int onceUpdateNumber) 
  9.   { 
  10.     if (string.IsNullOrEmpty(TableName)) return 0; 
  11.     if (string.IsNullOrEmpty(primaryKeyName)) return 0; 
  12.     if (columnsName == null || columnsName.Length <= 0) return 0; 
  13.     DataSet ds = new DataSet(); 
  14.     ds.Tables.Add(table); 
  15.     int result = 0; 
  16.     using (SqlConnection sqlconn = new SqlConnection(SqlHelper.ConnString)) 
  17.     { 
  18.       sqlconn.Open(); 
  19.  
  20.       //使用加强读写锁事务   
  21.       SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted); 
  22.       try 
  23.       { 
  24.         foreach (DataRow dr in ds.Tables[0].Rows) 
  25.         { 
  26.           //所有行设为修改状态   
  27.           dr.SetModified(); 
  28.         } 
  29.         //为Adapter定位目标表   
  30.         SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where {1}", TableName,limitWhere), sqlconn, tran); 
  31.         SqlDataAdapter da = new SqlDataAdapter(cmd); 
  32.         SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da); 
  33.         da.AcceptChangesDuringUpdate = false
  34.         string columnsUpdateSql = ""
  35.         SqlParameter[] paras = new SqlParameter[columnsName.Length]; 
  36.         //需要更新的列设置参数是,参数名为"@+列名" 
  37.         for (int i = 0; i < columnsName.Length; i++) 
  38.         { 
  39.           //此处拼接要更新的列名及其参数值 
  40.           columnsUpdateSql += ("[" + columnsName[i] + "]" + "=@" + columnsName[i] + ","); 
  41.           paras[i] = new SqlParameter("@" + columnsName[i], columnsName[i]); 
  42.         } 
  43.         if (!string.IsNullOrEmpty(columnsUpdateSql)) 
  44.         { 
  45.           //此处去掉拼接处最后一个"," 
  46.           columnsUpdateSql = columnsUpdateSql.Remove(columnsUpdateSql.Length - 1); 
  47.         } 
  48.         //此处生成where条件语句 
  49.         string limitSql = ("[" + primaryKeyName + "]" + "=@" + primaryKeyName); 
  50.         SqlCommand updateCmd = new SqlCommand(string.Format(" UPDATE [{0}] SET {1} WHERE {2} ", TableName, columnsUpdateSql, limitSql)); 
  51.         //不修改源DataTable   
  52.         updateCmd.UpdatedRowSource = UpdateRowSource.None; 
  53.         da.UpdateCommand = updateCmd; 
  54.         da.UpdateCommand.Parameters.AddRange(paras); 
  55.         da.UpdateCommand.Parameters.Add("@" + primaryKeyName, primaryKeyName); 
  56.         //每次往返处理的行数 
  57.         da.UpdateBatchSize = onceUpdateNumber; 
  58.         result = da.Update(ds,TableName); 
  59.         ds.AcceptChanges(); 
  60.         tran.Commit(); 
  61.  
  62.       } 
  63.       catch 
  64.       { 
  65.         tran.Rollback(); 
  66.       } 
  67.       finally 
  68.       { 
  69.         sqlconn.Dispose(); 
  70.         sqlconn.Close(); 
  71.       } 
  72.  
  73.  
  74.     } 
  75.     return result; 
  76.   } 
?
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表