ADO.NET_第九篇_OracleHelper

来源:互联网 发布:淘宝上的代报名靠谱吗 编辑:程序博客网 时间:2024/04/29 18:29

using System;
using System.Configuration;
using System.Data;
using System.Data.OracleClient;
using System.Collections;
namespace Dao.DBUtility
{
    public abstract class OracleHelper
    {
        public static readonly string ConnectionStringLocalTransaction =
            ConfigurationManager.ConnectionStrings["OraConnString1"].ConnectionString;
        public static readonly string ConnectionStringInventoryDistributedTransaction =
            ConfigurationManager.ConnectionStrings["OraConnString2"].ConnectionString;
        public static readonly string ConnectionStringOrderDistributedTransaction =
            ConfigurationManager.ConnectionStrings["OraConnString3"].ConnectionString;
    public static readonly string ConnectionStringProfile =
            ConfigurationManager.ConnectionStrings["OraProfileConnString"].ConnectionString;
    public static readonly string ConnectionStringMembership =
            ConfigurationManager.ConnectionStrings["OraMembershipConnString"].ConnectionString;
        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
        public static int ExecuteNonQuery(string connectionString,
                                        CommandType cmdType,
                                        string cmdText,
                                        params OracleParameter[] commandParameters)
        {
            OracleCommand cmd = new OracleCommand();
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }
        public static int ExecuteNonQuery(OracleTransaction trans,
                                        CommandType cmdType,
                                        string cmdText,
                                        params OracleParameter[] commandParameters)
        {
            OracleCommand cmd = new OracleCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
            int val = cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
            return val;
        }
        public static int ExecuteNonQuery(OracleConnection connection,
                                        CommandType cmdType,
                                        string cmdText,
                                        params OracleParameter[] commandParameters)
        {
            OracleCommand cmd = new OracleCommand();
            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
            int val = cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
            return val;
        }
        public static OracleDataReader ExecuteReader(string connectionString,
                                                    CommandType cmdType,
                                                    string cmdText,
                                                    params OracleParameter[] commandParameters)
        {
            OracleCommand cmd = new OracleCommand();
            OracleConnection conn = new OracleConnection(connectionString);
            try
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
        }
        public static object ExecuteScalar(string connectionString,
                                        CommandType cmdType,
                                        string cmdText,
                                        params OracleParameter[] commandParameters)
        {
            OracleCommand cmd = new OracleCommand();
            using (OracleConnection conn = new OracleConnection(connectionString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                object val = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return val;
            }
        }
      public static object ExecuteScalar(OracleTransaction transaction,
                                            CommandType commandType,
                                            string commandText,
                                            params OracleParameter[] commandParameters)
        {
         if(transaction == null)
          throw new ArgumentNullException("事务");
         if(transaction != null && transaction.Connection == null)
          throw new ArgumentException("事务以被回滚或提交,请提供一个打开的事务。", "事务");
           
         OracleCommand cmd = new OracleCommand();
           
         PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters);
           
         object retval = cmd.ExecuteScalar();
           
         cmd.Parameters.Clear();
         return retval;
      }
        public static object ExecuteScalar(OracleConnection connectionString,
                                        CommandType cmdType,
                                        string cmdText,
                                        params OracleParameter[] commandParameters)
        {
            OracleCommand cmd = new OracleCommand();
            PrepareCommand(cmd, connectionString, null, cmdType, cmdText, commandParameters);
            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();
            return val;
        }
        public static void CacheParameters(string cacheKey, params OracleParameter[] commandParameters)
        {
            parmCache[cacheKey] = commandParameters;
        }
        public static OracleParameter[] GetCachedParameters(string cacheKey)
        {
            OracleParameter[] cachedParms = (OracleParameter[])parmCache[cacheKey];
            if (cachedParms == null)
                return null;
            OracleParameter[] clonedParms = new OracleParameter[cachedParms.Length];
            for (int i = 0, j = cachedParms.Length; i < j; i++)
                clonedParms[i] = (OracleParameter)((ICloneable)cachedParms[i]).Clone();
            return clonedParms;
        }
        private static void PrepareCommand(OracleCommand cmd,
                                        OracleConnection conn,
                                        OracleTransaction trans,
                                        CommandType cmdType,
                                        string cmdText,
                                        OracleParameter[] commandParameters)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = cmdType;
            if (trans != null)
                cmd.Transaction = trans;
            if (commandParameters != null)
            {
                foreach (OracleParameter parm in commandParameters)
                    cmd.Parameters.Add(parm);
            }
        }
      public static string OraBit(bool value)
        {
         if(value)
          return "Y";
         else
          return "N";
      }
      public static bool OraBool(string value)
        {
         if(value.Equals("Y"))
          return true;
         else
          return false;
      }
    }
}

+++ 说明
(1) 这个抽象类对于初学者非常有学习价值;
(2) OracleHelper是Pet Shop中的一个抽象类,这个类是基本的,封装了数据库的操作。Pet Shop相当于一个框架,在.NET和JAVA中都可以使用;
(3) 之所以这样说,是因为,在Pet Shop中返回的数据集是IList,而不是DataSet或是DataTable;
(4) 在NHibernate中,查询返回的数据通常都是IList,但实际中有些数据控件在数据绑定上对IList的支持并不是很好,可以将IList转换成DataSet或DataTable。
(5) 该抽象类重载了三个ExecuteNonQuery()成员函数,用于删除修改编辑等操作,区别只在第一个参数。
(6) 这三个重载函数的区别是,第一个参数是连接字符串的一个,不带事务处理,不需要创建OracleConnection对象;第二个参数是事务,需要用OracleConnection创建事务和Oraclecommand对象;第三个参数是OracleConnection对象,不带事务;
(7) 该抽象类还有一个ExecuteReader()和三个重载的ExecuteScalar()成员函数,用于查询;
(8) 该抽象类中,没有返回DataTable和DataSet的方法,不知道为什么;
(9) 该抽象类中的PrepareCommand()成员函数,主要是将对个参数OracleParameter,添加到Oraclecommand.Parameters中。
(10) 该抽象类中的CacheParameters()和GetCachedParameters()成员函数是在缓存中,保存和获取参数OracleParameter;
(11) 该抽象类中的OraBit()和OraBool()成员函数是true和false在Y和N之间转换;
(12) 该抽象类中的五个静态只读变量,要在Web.Config文件的<connectionStrings></connectionStrings>中添加;
(13) 最后,封装操作的一个目的是,OracleCommand的操作比较麻烦。你自己可以到网上下载Pet Shop,它是免费的。