·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 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