OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

8/10/2015来源:ASP.NET技巧人气:1436

OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

公司的一个新项目使用asp.net MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当然,可以用代码生成器,不过配套的代码生成器暂时没有);又从网上找了一个封装了泛型方法的OracleHelper类,整合到一起,但貌似数据增删改查依然不方便;于是花了两天时间,在原有基础上对增删改查分页查询操作进行了面向对象的封装,并且对批量增删改操作进行事务封装,写事务代码更方便。

原理:

1、利用反射对增删改查进行面向对象的封装

2、事务:如果没有开启事务(没有调用OracleHelper类的BeginTransaction方法),则按原来的方法创建连接,操作数据库,然后关闭连接;如果开启了事务(调用了OracleHelper类的BeginTransaction方法),则一次Http请求使用同一个OracleConnection,增删改操作后不关闭连接,先提交事务,事务提交后才关闭连接,下次Http请求再重新创建一个OracleConnection。

说明:

OracleHelper类包含如下功能:

1、基础方法(执行简单SQL语句;执行带参数的SQL语句;存储过程操作;)

2、扩展方法(泛型方法)

3、增删改查(封装了增删改查分页查询操作;查询主表数据时,关联表数据作为主表的类的属性直接查询出来,而不只是关联表数据的ID;添加操作,关联表数据和主表数据要分别添加(使用事务确保一致性);删除操作,关联表数据和主表数据要分别删除(使用事务确保一致性);修改操作,如果关联表的是新增的(即ID变了),要先添加关联表数据,再更新主表数据,如果关联表不是新增的(即ID没变),则只需要更新主表,方法中会自动更新关联表(关联表如果还有关联表也支持))

4、事务

代码:

OracleHelper.cs:

using System;using System.Collections;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Data.OracleClient;using System.Linq;using System.Reflection;using System.Text;using System.xml.Linq;using Models;using System.Web;namespace DBUtil{    /// <summary>    /// Oracle操作类    /// 2014年9月25日    /// 写程序之前,首先引用System.Data.OracleClient    /// </summary>    public class OracleHelper    {        #region 变量        /// <summary>        /// 数据库连接字符串        /// </summary>        public static string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();        #endregion        #region 事务的OracleConnection        #region 数据库连接对象        /// <summary>        /// 获取打开的数据库连接对象        /// </summary>        public static OracleConnection GetOpenConnection()        {            OracleConnection connection = null;            string key = "Simpo_FQD_OracleConnection";            if (HttpContext.Current.Items[key] == null)            {                connection = new OracleConnection(connectionString);                connection.Open();                HttpContext.Current.Items[key] = connection;            }            else            {                connection = (OracleConnection)HttpContext.Current.Items[key];            }            return connection;        }        #endregion        #region 事务对象        /// <summary>        /// 获取事务对象        /// </summary>        public static OracleTransaction GetTran()        {            OracleTransaction tran = null;            string key = "Simpo_FQD_OracleTransaction";            if (HttpContext.Current.Items[key] == null)            {                tran = GetOpenConnection().BeginTransaction();                HttpContext.Current.Items[key] = tran;            }            else            {                tran = (OracleTransaction)HttpContext.Current.Items[key];            }            return tran;        }        #endregion        #region 开起事务标志        /// <summary>        /// 事务标志        /// </summary>        PRivate static string tranFlagKey = "Simpo_FQD_OracleTransaction_Flag";        /// <summary>        /// 添加事务标志        /// </summary>        public static void AddTranFlag()        {            HttpContext.Current.Items[tranFlagKey] = true;        }        /// <summary>        /// 移除事务标志        /// </summary>        public static void RemoveTranFlag()        {            HttpContext.Current.Items[tranFlagKey] = false;        }        /// <summary>        /// 事务标志        /// </summary>        public static bool TranFlag        {            get            {                bool tranFlag = false;                if (HttpContext.Current.Items[tranFlagKey] != null)                {                    tranFlag = (bool)HttpContext.Current.Items[tranFlagKey];                }                return tranFlag;            }        }        #endregion        #endregion        #region 基础方法        #region 公用方法        #region GetMaxID        /// <summary>        /// 不支持多用户并发,慎用,请使用GetNextID方法        /// </summary>        private static int GetMaxID(string fieldName, string tableName)        {            string strsql = "select max(" + fieldName + ")+1 from " + tableName;            object obj = OracleHelper.GetSingle(strsql);            if (obj == null)            {                return 1;            }            else            {                return int.Parse(obj.ToString());            }        }        #endregion        #region Exists        public static bool Exists(string strSql, params OracleParameter[] cmdParms)        {            object obj = OracleHelper.GetSingle(strSql, cmdParms);            int cmdresult;            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))            {                cmdresult = 0;            }            else            {                cmdresult = int.Parse(obj.ToString());            }            if (cmdresult == 0)            {                return false;            }            else            {                return true;            }        }        #endregion        #endregion        #region  执行简单SQL语句        #region Exists        public static bool Exists(string SQLString)        {            using (OracleConnection connection = new OracleConnection(connectionString))            {                using (OracleCommand cmd = new OracleCommand(SQLString, connection))                {                    try                    {                        connection.Open();                        object obj = cmd.ExecuteScalar();                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))                        {                            return false;                        }                        else                        {                            return true;                        }                    }                    catch (System.Data.OracleClient.OracleException e)                    {                        connection.Close();                        throw new Exception(e.Message);                    }                    finally                    {                        cmd.Dispose();                        connection.Close();                    }                }            }        }        #endregion        #region 执行SQL语句,返回影响的记录数        /// <summary>        /// 执行SQL语句,返回影响的记录数        /// </summary>        /// <param name="SQLString">SQL语句</param>        /// <returns>影响的记录数</returns>        public static int ExecuteSql(string SQLString)        {            OracleConnection connection = GetOpenConnection();            using (OracleCommand cmd = new OracleCommand(SQLString, connection))            {                try                {                    if (TranFlag) cmd.Transaction = GetTran();                    int rows = cmd.ExecuteNonQuery();                    return rows;                }                catch (System.Data.OracleClient.OracleException E)                {                    connection.Close();                    throw new Exception(E.Message);                }                finally                {                    cmd.Dispose();                    if (!TranFlag) connection.Close();                }            }        }        #endregion        #region 执行多条SQL语句,实现数据库事务        /// <summary>        /// 执行多条SQL语句,实现数据库事务。        /// </summary>        /// <param name="SQLStringList">多条SQL语句</param>          public static bool ExecuteSqlTran(ArrayList SQLStringList)        {            bool re = false;            using (OracleConnection connection = new OracleConnection(connectionStrin