问题描述:之前和同事做一个BS模式的项目,发现所用的框架模板在update数据库数据时,即使只update一个数据,该模板也会把表所对应的实体类里的所有参数一并写入update语句中,造成大量的资源浪费,因此自己琢磨了一下,写了一个只针对要修改的参数写入update语句。如有其他好的建议方法望不吝赐教.
参数说明:tablename,要插入的表名。
par, 数据的在数据库中的列名和要update的新值组成的hashtable键值对。因为项目中经常需要修改的参数类型涉及到诸如number,char,blob,datetime等,因此在传入参数名称与新值时使用了hashtable,虽然hashtable需要装拆箱,每次都需要对key值进行转换,但是在OracleParameter方法中,value正好对应其传入类型。如果update的数据类型比较单一则这里的hashtable可以改用dictionary
qua,插入的条件名和对应的条件值组成的hashtable键值对。条件类型如果比较单一,则可改用dictionary
PS:在拼接语句时一定要注意不要少了空格,空格,空格 重要的事情说三遍
/// <summary> /// 修改数据 /// </summary> /// <param name="tableName">表名</param> /// <param name="par">新值</param> /// <param name="qua">条件</param> /// <returns></returns> public static bool UpDateOrc(string tableName, Hashtable par, Hashtable qua) { string sql = " update " + tableName + " set "; using (OracleConnection conn = new OracleConnection(ConnectWebOracle)) { List<OracleParameter> parList = new List<OracleParameter>(); foreach (DictionaryEntry p in par) { string pName = p.Key.ToString(); sql += " " + pName + "="; sql += ":" + pName + " ,"; OracleParameter opa = new OracleParameter(":" + pName, p.Value); parList.Add(opa); } sql = sql.TrimEnd(','); sql += " where 1=1"; foreach (DictionaryEntry q in qua) { string qName = q.Key.ToString(); sql += " and " + qName + "="; sql += ":" + qName + " "; OracleParameter opa = new OracleParameter(":" + qName, q.Value); parList.Add(opa); } try { conn.Open(); OracleCommand cmd = new OracleCommand(sql, conn); foreach (var p in parList) { cmd.Parameters.Add(p); } int result = cmd.ExecuteNonQuery();//result接收受影响行数,也就是说result大于0的话表示添加成功 conn.Close(); cmd.Dispose(); if (result <= 0) { return false;//修改失败 } return true;//修改成功
} catch (Exception e) { MessageBox.show(e.Message); return false; } } }
/// <summary> /// 插入学员数据 /// </summary> public static bool InsertTB(string tableName, Hashtable ht) { string sq1 = " insert into " + tableName + " ( id,"; string sq2 = "values(c_data_id.nextval, ";//经常有人在写插入语句时插入失败,原因在于没有为当前的插入行的唯一键值赋值 //解决方法为在plsql查询工具里,找到sequence文件夹,创建一个递增参数,此处命名为‘c_data_id’,用如上方式写入插入语句即可插入成功 using (OracleConnection conn = new OracleConnection(ConnectWebOracle)) { List<OracleParameter> parList = new List<OracleParameter>(); foreach (DictionaryEntry p in ht) { sq1 += p.Key + ","; sq2 += ":" + p.Key + ","; OracleParameter opa = new OracleParameter(":" + p.Key, p.Value); parList.Add(opa); } sq1 = sq1.TrimEnd(','); sq1 += ")"; sq2 = sq2.TrimEnd(','); sq2 += ")"; string sql = sq1 + sq2; try { conn.Open(); OracleCommand cmd = new OracleCommand(sql, conn); foreach (var p in parList) { cmd.Parameters.Add(p); } int result = cmd.ExecuteNonQuery();//result接收受影响行数,也就是说result大于0的话表示添加成功 conn.Close(); cmd.Dispose(); if (result <= 0) { return fasle;//插入失败 } return true;//插入成功 } catch (Exception e) {MessageBox.show(e.Message); return false; } } }