OracleHelper类

using System;
using System.Data;
using System.Collections;
using System.Configuration;
using System.Data.OracleClient;

namespace DBhepler
{
    /// <summary>
    /// A helper class used to execute queries against an Oracle database||一个用于Oracle DB查询的帮助类
    /// </summary>
    public abstract class OracleHelper
    {
        //Database connection strings
        private static readonly string connectionString =ConfigurationManager.AppSettings["OrcConnStr"];

        //Create a hashtable for the parameter cached||为缓存中的参数创建一张hashtable
        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

        /// <summary>
        /// Internal function to prepare a command for execution by the database||关于command的数据库执行的内部函数
        /// </summary>
        /// <param name="cmd">Existing command object||现有的command(命令)对象</param>
        /// <param name="conn">Database connection object数据库链接对象</param>
        /// <param name="trans">Optional transaction object||可选事务对象</param>
        /// <param name="cmdType">Command type,e.g. stored procedure||命令类型:例如:存储结构</param>
        /// <param name="cmdText">Command text||命令文本</param>
        /// <param name="commandParameters">Parameters for the command||命令参数</param>
        private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, CommandType cmdType, string cmdText, OracleParameter[] commandParameters)
        {
            //Open the connection if required
            if (conn.State != ConnectionState.Open)
                conn.Open();

            //Set up the command
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = cmdType;

            //Bind it to the transaction if it exists
            if (trans != null)
                cmd.Transaction = trans;

            // Bind the parameters passed in
            if (commandParameters != null)
            {
                foreach (OracleParameter parm in commandParameters)
                    cmd.Parameters.Add(parm);
            }
        }
 
        /// <summary>
        /// Execute a database query which does not include a select||执行数据库查询,其中不包括一个选择
        /// </summary>
        /// <remark>
        /// e.g.:  
        ///  int result = ExecuteNonQuery(conn, CommandType.Text, sql, new OracleParameter(":prodid", 24));
        /// </remark>
        /// <param name="connString">Connection string to database||数据库链接字符串</param>
        /// <param name="cmdType">the CommandType (stored procedure, text, etc.)||命令类型(SQL语句等)</param>
        /// <param name="cmdText">the stored procedure name or PL/SQL command||存储过程或SQL语句</param>
        /// <param name="commandParameters">an array of OracleParamters used to execute the command||用于执行命令oracleparamters数组</param>
        /// <returns>an int representing the number of rows affected by the command||返回该命令影响的行数(int类型)</returns>
        public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParameters)
        {
            OracleCommand cmd = new OracleCommand();
            using (OracleConnection conn = new OracleConnection(connectionString))
            {
                conn.Open();
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }

        /// <summary>
        /// Execute an OracleCommand (that returns no resultset) against an existing database transaction||对现有的数据库事务执行OracleCommand(不返回结果集) 
        /// using the provided parameters.||使用提供的参数
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new OracleParameter(":prodid", 24));
        /// </remarks>
        /// <param name="trans">an existing database transaction||现有的数据库事务</param>
        /// <param name="cmdType">the CommandType (stored procedure, text, etc.)||命令类型(存储过程等)</param>
        /// <param name="cmdText">the stored procedure name or PL/SQL command||存储过程或SQL语句</param>
        /// <param name="cmdParameters">an array of OracleParamters used to execute the command||用于执行命令oracleparamters数组</param>
        /// <returns>an int representing the number of rows affected by the command||返回该命令影响的行数(int类型)</returns>
        public static int ExecuteNonQuery(OracleTransaction trans, CommandType cmdType, string cmdText, params OracleParameter[] cmdParameters)
        {
            OracleCommand cmd = new OracleCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;

        }
        
        /// <summary>
        /// Execute an OracleCommand (that returns no resultset) against an existing database connection||对现有的数据库链接执行OracleCommand(不返回结果集)
        /// using the provided parameters.
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  int result = ExecuteNonQuery(connString, CommandType.TableDirect,, "TableName", new OracleParameter(":prodid", 24));
        /// </remarks>
        /// <param name="connectionString">an existing database connection||现有的数据库链接</param>
        /// <param name="cmdType">the CommandType (stored procedure, text, etc.)||命令类型(表等)</param>
        /// <param name="cmdText">the stored procedure name or PL/SQL command||存储过程或SQL语句</param>
        /// <param name="cmdParameters">an array of OracleParamters used to execute the command||用于执行命令oracleparamters数组</param>
        /// <returns>an int representing the number of rows affected by the command||返回该命令影响的行数(int类型)</returns>
        public static int ExecuteNonQuery(OracleConnection connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParameters)
        {
            OracleCommand cmd = new OracleCommand();
            PrepareCommand(cmd, connectionString, null, cmdType, cmdText, cmdParameters);
            int val = cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
            return val;

        }

        /// <summary>
        /// Batch execution about ExecuteNonQuery||ExecuteNonQuery的批量执行
        /// </summary>
        /// <remarks>
        /// Usage according to ExecuteNonQuery||用法参照ExecuteNonQuery
        /// </remarks>
        /// <param name="connectionString"></param>
        /// <param name="cmdType"></param>
        /// <param name="cmdText"></param>
        /// <param name="cmdParameters"></param>
        /// <returns></returns>
        public static int ExecuteBatchNonQuery(string connectionString, CommandType cmdType, string[] cmdText, params OracleParameter[] cmdParameters)
        {
            int val = 0;
            OracleCommand cmd = new OracleCommand();
            using (OracleConnection conn = new OracleConnection(connectionString))
            {
                conn.Open();
                cmd.Connection = conn;
                OracleTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try 
                {
                    for(int i=0;i<cmdText.Length;i++)
                    {
                        cmd.CommandText = cmdText[i];
                        cmd.ExecuteNonQuery();
                    }
                    tx.Commit();
                    val = 1;
                }
                catch(System.Data.OracleClient.OracleException e)
                {
                    tx.Rollback();
                    throw new Exception(e.Message);
                }
                finally
                {
                    conn.Close();
                }
                return val;
            }
        }

        /// <summary>
        /// Execute a select query that will return a result set||执行一个查询,将返回结果集
        /// </summary>
        /// <param name="connString">Connection string</param>
        /// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        /// <param name="commandText">the stored procedure name or PL/SQL command</param>
        /// <param name="commandParameters">an array of OracleParamters used to execute the command</param>
        /// <returns>return a result set(OracleDataReader)</returns>
        public static OracleDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParameters)
        {
            OracleCommand cmd = new OracleCommand();
            OracleConnection conn = new OracleConnection(connectionString);
            try
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);

                OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
            finally
            { 
            }
        }

        /// <summary>
        /// Execute a select query that will return a DataSet||执行一个查询,将返回数据集
        /// </summary>
        /// <param name="connString">Connection string</param>
        /// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        /// <param name="commandText">the stored procedure name or PL/SQL command</param>
        /// <param name="commandParameters">an array of OracleParamters used to execute the command</param>
        /// <returns>return a result set(OracleDataReader)</returns>
        public static DataSet ExecuteReadAdapter(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParameters)
        {
            OracleCommand cmd = new OracleCommand();
            OracleConnection conn = new OracleConnection(connectionString);
            DataSet ds = new DataSet();
            try
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);

                OracleDataAdapter OrcAdapter = new OracleDataAdapter(cmd);
                OrcAdapter.Fill(ds);
                cmd.Parameters.Clear();
                return ds;
            }
            catch
            {
                conn.Close();
                throw;
            }
            finally
            {
            }
        }

        /// <summary>
        /// Execute an OracleCommand that returns the first column of the first record against the database specified in the connection string 
        /// using the provided parameters.
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter(":prodid", 24));
        /// </remarks>
        /// <param name="connectionString">a valid connection string for a SqlConnection</param>
        /// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        /// <param name="commandText">the stored procedure name or PL/SQL command</param>
        /// <param name="commandParameters">an array of OracleParamters used to execute the command</param>
        /// <returns>An object that should be converted to the expected type using Convert.To{Type}</returns>

        public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParameters)
        {
            OracleCommand cmd = new OracleCommand();

            using(OracleConnection conn=new OracleConnection(connectionString))
            {
                PrepareCommand(cmd,conn,null,cmdType,cmdText,cmdParameters);
                object val = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return val;
            }
        }

        ///<summary>
        ///Execute a OracleCommand (that returns a 1x1 resultset) against the specified SqlTransaction
        ///using the provided parameters.
        ///</summary>
        ///<param name="transaction">A valid SqlTransaction</param>
        ///<param name="commandType">The CommandType (stored procedure, text, etc.)</param>
        ///<param name="commandText">The stored procedure name    or PL/SQL command</param>
        ///<param name="commandParameters">An array of    OracleParamters used to execute the command</param>
        ///<returns>An object containing the value in the 1x1 resultset generated by the command</returns>
        public static object ExecuteScalar(OracleTransaction trans, CommandType cmdType, string cmdText, params OracleParameter[] cmdParameters)
        {
            if (trans == null)
                throw new ArgumentNullException("trans");
            if (trans != null && trans.Connection == null)
                throw new ArgumentException("The transaction was rollbacked or commited,please provide an open transacton.","trans");

            OracleCommand cmd = new OracleCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParameters);
            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();
            return val;

        }

        /// <summary>
        /// Execute an OracleCommand that returns the first column of the first record against an existing database connection 
        /// using the provided parameters.
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  Object obj = ExecuteScalar(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter(":prodid", 24));
        /// </remarks>
        /// <param name="conn">an existing database connection</param>
        /// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        /// <param name="commandText">the stored procedure name or PL/SQL command</param>
        /// <param name="commandParameters">an array of OracleParamters used to execute the command</param>
        /// <returns>An object that should be converted to the expected type using Convert.To{Type}</returns>
        public static object ExecuteScalar(OracleConnection connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParameters)
        {
            OracleCommand cmd = new OracleCommand();

            PrepareCommand(cmd, connectionString, null, cmdType, cmdText, cmdParameters);
            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();
            return val;
        }
        
        /// <summary>
        /// Add a set of parameters to the cached||缓存中添加一个参数设置
        /// </summary>
        /// <param name="cacheKey">Key value to look up the parameters||查找参数的关键值</param>
        /// <param name="cmdParameters">Actual parameters to cached||实际参数缓存</param>
        public static void CacheParameters(string cacheKey,params OracleParameter[] cmdParameters)
        {
            parmCache[cacheKey] = cmdParameters;
        }
        
        /// <summary>
        /// Fetch parameters form the cache||从缓存中取出参数
        /// </summary>
        /// <param name="cacheKey"> Key to look up the parameters||查找参数的关键字</param>
        /// <returns></returns>
        public static OracleParameter[] GetCachedParameters(string cacheKey)
        {
            OracleParameter[] cacheParms = (OracleParameter[])parmCache[cacheKey];
            if (cacheParms == null)
                return null;
            OracleParameter[] clonedParms = new OracleParameter[cacheParms.Length];
            for (int i = 0, j = cacheParms.Length; i < j; i++)
                clonedParms[i] = (OracleParameter)((ICloneable)cacheParms[i]).Clone();
            return clonedParms;
        }
        
        /// <summary>
        /// Converter to use boolean data type with Oracle||Oracle中bool类型值转换成string类型
        /// </summary>
        /// <param name="value">Value to convert||转换的值</param>
        /// <returns></returns>
        public static string OraBit(bool value)
        {
            if (value)
                return "Y";
            else
                return "N";
        }

        /// <summary>
        /// Converter to use boolean data type with Oracle||Oracle中string类型值转换成bool类型
        /// </summary>
        /// <param name="value">Value to convert||转换的值</param>
        /// <returns></returns>
        public static bool OraBool(string value)
        {
            if (value.Equals("Y"))
                return true;
            else
                return false;
        }
    }
}

 

posted @ 2015-02-01 13:25  狂想NICE  阅读(602)  评论(0编辑  收藏  举报