【C#,Oracle】用批量插入和修改Oracle数据库多条数据

时间:2021-08-28 21:40:59

问题描述:之前和同事做一个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; }
            }
        }