公司的一個新項目使用asp.net MVC開發(fā),經(jīng)理讓我寫個OracleHelper,我從網(wǎng)上找了一個比較全的OracleHelper類,缺點是查詢的時候返回DataSet,數(shù)據(jù)增刪改要寫很多代碼(當然,可以用代碼生成器,不過配套的代碼生成器暫時沒有);又從網(wǎng)上找了一個封裝了泛型方法的OracleHelper類,整合到一起,但貌似數(shù)據(jù)增刪改查依然不方便;于是花了兩天時間,在原有基礎上對增刪改查分頁查詢操作進行了面向?qū)ο蟮姆庋b,并且對批量增刪改操作進行事務封裝,寫事務代碼更方便。
原理:
1、利用反射對增刪改查進行面向?qū)ο蟮姆庋b
2、事務:如果沒有開啟事務(沒有調(diào)用OracleHelper類的BeginTransaction方法),則按原來的方法創(chuàng)建連接,操作數(shù)據(jù)庫,然后關閉連接;如果開啟了事務(調(diào)用了OracleHelper類的BeginTransaction方法),則一次Http請求使用同一個OracleConnection,增刪改操作后不關閉連接,先提交事務,事務提交后才關閉連接,下次Http請求再重新創(chuàng)建一個OracleConnection。
說明:
OracleHelper類包含如下功能:
1、基礎方法(執(zhí)行簡單SQL語句;執(zhí)行帶參數(shù)的SQL語句;存儲過程操作;)
2、擴展方法(泛型方法)
3、增刪改查(封裝了增刪改查分頁查詢操作;查詢主表數(shù)據(jù)時,關聯(lián)表數(shù)據(jù)作為主表的類的屬性直接查詢出來,而不只是關聯(lián)表數(shù)據(jù)的ID;添加操作,關聯(lián)表數(shù)據(jù)和主表數(shù)據(jù)要分別添加(使用事務確保一致性);刪除操作,關聯(lián)表數(shù)據(jù)和主表數(shù)據(jù)要分別刪除(使用事務確保一致性);修改操作,如果關聯(lián)表的是新增的(即ID變了),要先添加關聯(lián)表數(shù)據(jù),再更新主表數(shù)據(jù),如果關聯(lián)表不是新增的(即ID沒變),則只需要更新主表,方法中會自動更新關聯(lián)表(關聯(lián)表如果還有關聯(lián)表也支持))
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> /// 數(shù)據(jù)庫連接字符串 /// </summary> public static string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString(); #endregion #region 事務的OracleConnection #region 數(shù)據(jù)庫連接對象 /// <summary> /// 獲取打開的數(shù)據(jù)庫連接對象 /// </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> /// 不支持多用戶并發(fā),慎用,請使用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 執(zhí)行簡單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 執(zhí)行SQL語句,返回影響的記錄數(shù) /// <summary> /// 執(zhí)行SQL語句,返回影響的記錄數(shù) /// </summary> /// <param name="SQLString">SQL語句</param> /// <returns>影響的記錄數(shù)</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 執(zhí)行多條SQL語句,實現(xiàn)數(shù)據(jù)庫事務 /// <summary> /// 執(zhí)行多條SQL語句,實現(xiàn)數(shù)據(jù)庫事務。 /// </summary> /// <param name="SQLStringList">多條SQL語句</param> public static bool ExecuteSqlTran(ArrayList SQLStringList) { bool re = false; using (OracleConnection connection = new OracleConnection(connectionStrin
新聞熱點
疑難解答