批量插入或更新数据的时候,如果每条SQL语句都打开关闭一次数据库,如果数据量大的时候,会明显的对数据库造成很大的压力,那么我们能不能使用打开一次数据库,等待所有
语句更新完毕,再关闭数据库呢?
以Oracle数据库为例:
使用如下办法,把SQL语句组合在一起就完成了
update table set class=5 where id=1; update table set class=6 where id=2; update table set class=7 where id=3; update table set class=8 where id=4;
把上述语句放到一个字符串中,可以完成,如下:
string sql=string.Format("update table set class={0} where id={1};update table set class={2} where id={3};update table set class={4} where id= {5};",5,1,6,2,7,3);
但问题又出来了,对于SQL安全,建议一般使用parameter方式,可是如下的语句只能更新一条数据,如何批量更新呢?
StringBuilder sb = new StringBuilder(); sb.Append("update table set "); sb.Append(" classid =:classid"); sb.Append(" where id=:id"); OracleParameter[] parameters = { new OracleParameter(":classid",OracleType.Number,8), new OracleParameter(":id",OracleType.Number,9) }; parameters[0].Value = model.classid; parameters[3].Value = model.ID;
向如上的形式,带parameter参数如何批量插入和更新?
具体的解决办法如下,如果大侠有更好的办法,可以借鉴学习,我的拙法拿出来给没有想出法子的兄弟用一下:
/// <summary> /// 更新,一次打开数据库批量更新 /// </summary> /// <param name="list">传入的参数是集合,批量传入</param> /// <returns>如果更新成功,则返回true</returns> public static bool Update(List<MO_Model> list) //MO_Model为 model层的用到的类 { //DB.connectionString,数据库连接,可以调用DB里的connectionString //打开数据库 using (OracleConnection connection = new OracleConnection(DB.connectionString)) { int num = 0;//记录更新成功的数量 for (int i = 0; i < list.Count; i++) //循环集合 { MO_Model model = new MO_Model(); model = list[i]; StringBuilder sb = new StringBuilder(); sb.Append("update table set "); sb.Append(" classid =:classid"); sb.Append(" where id=:id"); OracleParameter[] parameters = { new OracleParameter(":classid",OracleType.Number,8), new OracleParameter(":id",OracleType.Number,9) }; parameters[0].Value = model.classid; parameters[3].Value = model.ID; using (OracleCommand cmd = new OracleCommand()) { try { PrepareCommand(cmd, connection, null, sb.ToString(), parameters); //调用PrepareCommand方法 int obj = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); if (obj>0) { num++; } } catch (System.Data.OracleClient.OracleException e) { continue; //throw new Exception(e.Message); } } } if (num > 0) { return true; } else { return false; } } } /// <summary> /// PrepareCommand /// </summary> private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) cmd.Transaction = trans; cmd.CommandType = CommandType.Text; if (cmdParms != null) { foreach (OracleParameter parm in cmdParms) cmd.Parameters.Add(parm); } }
浙公网安备 33010602011771号