⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oracledbutils.cs

📁 基于C/S的医疗卫生管理系统
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using Oracle.DataAccess.Client;

using Qeb.Support.Common;

namespace Qeb.Support.DataAccess
{
    internal sealed class OracleDBUtils:IDBUtils
    {
        // 数据库连接对象
		private OracleConnection m_Conn;
		// 事务对象
		private OracleTransaction m_Trans;
		// 连接字符串
		private string m_ConnString;
		// IDisposable参数
		private bool m_Disposed;


		// 事务是否已开启
		public bool IsTransStart
        {
            get{
                if (m_Trans == null || m_Trans.Connection == null)
                    return false;
                else
                    return true;
            }
        }


        #region 构造器

        /// <summary>
        ///  构造器
        /// </summary>
        /// <param name="connection">连接字符串</param>
        public OracleDBUtils(string connection)
        {
            m_Conn = null;
            m_Trans = null;
            m_ConnString = connection;
            m_Disposed = false;
        }

        #endregion

        #region GetConection
        private OracleConnection GetConnection()
        {
            if (m_Conn == null)
            {
                m_Conn = new OracleConnection(m_ConnString);
            }
            if (m_Conn.State == ConnectionState.Closed)
            {
                m_Conn.Open();
            }
            return m_Conn;
        }
        #endregion

        #region ExecuteNonQuery
        public int ExecuteNonQuery(IDbCommand dbCommand)
        {
            int ret = -1;
            try
            {
                dbCommand.Connection = GetConnection();
                ret = dbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                string desc = "";
                if (dbCommand == null)
                    desc = "dbCommand is null";
                else
                    desc = dbCommand.CommandText;

                AppLog.Add(new AppError(ex.Message, desc, this.GetType(), ex));

                throw;
            }

            return ret;
        }
        #endregion

        #region ExecuteScalar
        public object ExecuteScalar(IDbCommand dbCommand)
        {
            object ret = null;
            try
            {
                dbCommand.Connection = GetConnection();
                ret = dbCommand.ExecuteScalar();
            }
            catch (Exception ex)
            {
                string desc = "";
                if (dbCommand == null)
                    desc = "dbCommand is null";
                else
                    desc = dbCommand.CommandText;

                AppLog.Add(new AppError(ex.Message, desc, this.GetType(), ex));

                throw;
            }

            return ret;
        }
        #endregion

        #region GetNextID
        public string GetNextID(string identity)
        {
            throw new Exception("未完成的方法");
        }
        #endregion

        #region GetCurrentID
        public string GetCurrentID(string identity)
        {
            throw new Exception("未完成的方法");
        }
        #endregion

        public void Fill(DataTable table, IDbCommand dbCommand)
        {
            OracleDataAdapter adapter = null;
            try
            {
                dbCommand.Connection = this.GetConnection();
                adapter = new OracleDataAdapter((OracleCommand)dbCommand);
                adapter.Fill(table);
            }
            catch (Exception ex)
            {
                string desc = "";
                if (dbCommand == null)
                    desc = "dbCommand is null";
                else
                    desc = dbCommand.CommandText;

                AppLog.Add(new AppError(ex.Message, desc, this.GetType(), ex));

                throw;
            }
            finally
            {
                if (adapter != null)
                    adapter.Dispose();
            }
        }

        public void Fill(DataTable table, IDbCommand dbCommand, int pageIndex, int pageSize)
        {

        }

        #region 事务控制

        /// <summary>
        /// 启动默认级别事务
        /// </summary>
        public void BeginTransaction()
        {
            BeginTransaction(IsolationLevel.ReadCommitted);
        }

        /// <summary>
        /// 启动指定级别事务
        /// </summary>
        public void BeginTransaction(IsolationLevel level)
        {
            try
            {
                m_Conn = GetConnection();
                m_Trans = m_Conn.BeginTransaction(level);
            }
            catch(Exception ex)
            {
                AppLog.Add(new AppError(ex.Message, "BeginTransaction出错", this.GetType(), ex));

                throw;
            }
        }

        /// <summary>
        /// 提交事务
        /// </summary>
        public void Commit()
        {
            try
            {
                m_Trans.Commit();
            }
            catch (Exception ex)
            {
                AppLog.Add(new AppError(ex.Message, "Commit出错", this.GetType(), ex));

                throw;
            }
            finally
            {
                if (m_Trans != null)
                {
                    m_Trans.Dispose();
                    m_Trans = null;
                }
            }
        }

        /// <summary>
        /// 回滚事务
        /// </summary>
        public void Rollback()
        {
            //catch (InvalidOperationException  ) 
            try
            {
                m_Trans.Rollback();
            }            
            catch(Exception ex)
            {
                AppLog.Add(new AppError(ex.Message, "回滚事务出错", this.GetType(), ex));

                throw;
            }
            finally
            {
                if (m_Trans != null)
                {
                    m_Trans.Dispose();
                    m_Trans = null;
                }
            }
        }

        #endregion


        public IDbCommand NewCommand()
        {
            return new OracleCommand();
        }

        public IDataParameter NewParameter()
        {
            return new OracleParameter();
        }

        public void CloseDB()
        {
            //关闭数据库前,如果存在未提交的事务则回滚
            if (this.IsTransStart)
            {            
                try
                {                    
                    this.Rollback();
                }
                catch(Exception ex)
                {
                    AppError error = new AppError(ex.Message, "关闭数据库连接前自动回滚事务出错", this.GetType(), ex);
                    AppLog.Add(error);
                    //不再抛出异常
                }
                finally
                {
                    AppLog.Add("关闭数据库连接前有事务未处理,系统已自动回滚", LogEntryType.Warning, this.GetType());
                }
            }

            try
            {
                if (m_Conn != null && m_Conn.State != ConnectionState.Closed)
                    m_Conn.Close();
            }
            catch (Exception ex)
            {
                AppError error = new AppError(ex.Message, "关闭数据库连接出错", this.GetType(), ex);
                AppLog.Add(error);
                //不再抛出异常
            }
            
        }
        #region 销毁资源
        /// <summary>
		/// 销毁资源
		/// </summary>
		public void Dispose()
		{
			Dispose(true);
			GC.SuppressFinalize(this);
		}

		private void Dispose(bool disposing)
		{
            if (!this.m_Disposed)
			{
				if(disposing)
				{
					if (m_Conn != null)
					{
						m_Conn.Dispose();
						m_Conn = null;
					}
                    if (m_Trans != null)
                    {
                        m_Trans.Dispose();
                        m_Trans = null;
                    }
				}
			}
            m_Disposed = true;
		}

		#endregion
    }
}
//[MethodImpl(MethodImplOptions.Synchronized)]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -