您的位置:首页 > 数据库 > Oracle

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

2018-03-27 18:04 2376 查看
问题描述:之前和同事做一个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; }
            }
        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息