在操做數據庫時,咱們須要注意一點,就是in查詢的參數不能超過1000個,不然會報錯,因此咱們在進行in查詢的時候須要對參數數量進行控制:sql
用於分解數組的擴展方法:數據庫
/// <summary> /// 根據數量對數組進行分組(in查詢不能超過1000個條目) /// </summary> /// <param name="list"></param> /// <param name="size">數量</param> private List<List<long>> GroupListBySize(List<long> list,int size) { List<List<long>> listArr = new List<List<long>>(); int arrSize = list.Count() % size == 0 ? list.Count() / size : list.Count() / size + 1; for (int i = 0; i < arrSize; i++) { List<long> sub = new List<long>(); for (int j = i * size; j <= size * (i + 1) - 1; j++) { if (j <= list.Count() - 1) { sub.Add(list[j]); } } listArr.Add(sub); } return listArr; }
如:數組長度爲2500,size(按照多少數量進行分割),這裏咱們傳1000,則會被分解爲三個數組,長度分別爲,1000,1000,500;數組
業務層的方法接口:spa
/// <summary> /// 根據id批量修改狀態 /// </summary> /// <returns></returns> public bool ButchChangeState(List<long> ids, int state) { if (ids.Count > 0) { if (ids.Count()>1000) { var lists = GroupListBySize(ids,1000); foreach (var list in lists) { dal.ButchChangeState(list,state); } } else { dal.ButchChangeState(ids, state); } return true; } else { return false; } }
數據庫交互:code
/// <summary> /// 修改狀態////0:已執行,1:執行中,2:執行失敗,3:待下發 /// </summary> /// <param name="ids"></param> /// <param name="state"></param> /// <returns></returns> public bool ButchChangeState(List<long> ids, int state) { if (ids.Count > 0) { string idStr = string.Join(",", ids); //List數組的每一個元素加上引號,如("12","32","5456","876455") string idString = string.Format("'{0}'", idStr.Replace(",", "','")); string sql = $" update COMMAND_ACCESSLOG set WORKSTATE = {state},STRING1=:DOWNSENDTIME where COMMANDID in ( {idString} )"; OracleParameter[] parameters = { new OracleParameter(":DOWNSENDTIME",OracleDbType.Varchar2,1024) }; parameters[0].Value = DateTime.Now.ToString(); var row = DbHelperOra.ExecuteSql(sql,parameters); return row > 0 ? true : false; } else { return false; } }