这是最基本的批量更新。我使用的时候还不如逐条。
这好像还是官方的批量更新,反正不咋地。
///批量更新,效率太低,不如逐条更新static void Update(){SqlDataAdapter sda = new SqlDataAdapter("select PID,FMAddress,MeanValue1,StatsValue1,RatioValue1,StatsFlag1,MeanValue2,StatsValue2,RatioValue2,StatsFlag2 from tblRptDay where RptDate='2016-08' and RptDay='02'", SqlHelper.conStr);//sql语句:多了空格;字符串截取:起始位置出错DataTable dtx = new DataTable();sda.Fill(dtx);foreach (tblRptDay t in updateDayList){if (t.FMAddress != null){try{DataRow[] drs = dtx.Select("FMAddress ='" + t.FMAddress + "'");DataRow dr = drs[0];dr["MeanValue1"] = t.MeanValue1;dr["StatsValue1"] = t.StatsValue1;dr["RatioValue1"] = t.RatioValue1;dr["StatsFlag1"] = t.StatsFlag1;dr["MeanValue2"] = t.MeanValue2;dr["StatsValue2"] = t.StatsValue2;dr["RatioValue2"] = t.RatioValue2;dr["StatsFlag2"] = t.StatsFlag2;}catch (Exception){}}}SqlCommandBuilder scb = new SqlCommandBuilder(sda);//执行更新sda.Update(dtx.GetChanges());//使DataTable保存更新dtx.AcceptChanges();}
下面是另一种更新,这是在表级别的更新。
先要获取主键和要更新的字段。然后改吧改吧形成一个新的datatable。再一次性更新到数据库。感觉和批量插入类似,批量插入要自己造一个datatable,然后一次性插入到数据库。
1 //把数据库的压力转移到内存 2 static void Update() 3 { 4 5 SqlConnection conn = new SqlConnection(SqlHelper.conStr); 6 7 conn.Open(); 8 SqlDataAdapter sd = new SqlDataAdapter(); 9 SqlCommandBuilder sqlBulider = new SqlCommandBuilder(sd); 10 DataSet dataset = new DataSet(); 11 12 sd.SelectCommand = new SqlCommand("select PID,MeanValue1,StatsValue1,RatioValue1,StatsFlag1,MeanValue2,StatsValue2,RatioValue2,StatsFlag2,FMAddress from tblrptday_20170213 where RptDate='" + date.Substring(0, 7) + "' and RptDay='" + date.Substring(8, 2) + "'", conn); 13 //一定要加上主键 14 15 sd.Fill(dataset); 16 17 foreach (tblRptDay t in updateDayList) 18 { 19 if (t.FMAddress != null) 20 { 21 for (int i = 0; i < dataset.Tables[0].Rows.Count; i++) 22 { 23 if (t.FMAddress == (string)dataset.Tables[0].Rows[i]["FMAddress"]) 24 { 25 dataset.Tables[0].Rows[i].BeginEdit(); 26 dataset.Tables[0].Rows[i]["MeanValue1"] = t.MeanValue1; 27 dataset.Tables[0].Rows[i]["StatsValue1"] = t.StatsValue1; 28 dataset.Tables[0].Rows[i]["RatioValue1"] = t.RatioValue1; 29 dataset.Tables[0].Rows[i]["StatsFlag1"] = t.StatsFlag1; 30 dataset.Tables[0].Rows[i]["MeanValue2"] = t.MeanValue2; 31 dataset.Tables[0].Rows[i]["StatsValue2"] = t.StatsValue2; 32 dataset.Tables[0].Rows[i]["RatioValue2"] = t.RatioValue2; 33 dataset.Tables[0].Rows[i]["StatsFlag2"] = t.StatsFlag2; 34 dataset.Tables[0].Rows[i].EndEdit(); 35 break; 36 } 37 38 } 39 40 } 41 } 42 sd.Update(dataset.Tables[0]); 43 conn.Close(); 44 dataset.Tables[0].Clear(); 45 sd.Dispose(); 46 dataset.Dispose(); 47 //一定要释放 48 }
性能是逐条的20多倍。一般比表连更新方便。
还有表连批量更新,写sql脚本进行批量更新,基于ORM框架的更新。
因为orm框架会自动把sql存储起来然后再一次执行。所以基于ORM框架的更新类似于写sql脚本进行批量更新。