现在的位置: 首页 > 综合 > 正文

数据库层封装

2018年02月12日 ⁄ 综合 ⁄ 共 16647字 ⁄ 字号 评论关闭

using System;

using System.ComponentModel;

using System.Collections;

using System.Diagnostics;

using System.Data;

using System.Data.SqlClient;

using System.Data.OleDb;

using System.Configuration;

using System.IO;

namespace DataAccess

{

    public class Database : IDisposable

    {      

       

        private SqlConnection connection;

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 执行连锁的插入操作。

         *             即利用插入语句sqlOne得到的ID作为后面插入语句的属性之一。

         *  输入参数: 

         *             sqlOne       执行的第一条SQL语句,

         *             pramsOne     sqlOne语句对应的参数,

         *             sqls         连锁执行的SQL语句链表,

         *             prams        与sqls中每条SQL语句相对应的参数。

         * 

         * sqls和prams示例: 

         *             string sqlOne = "insert into T_User(...) values(...)"; // T_Userd的UserID自增。

         *             SqlParameter[] pramsOne = {...};

         * 

         *             int areaid = 123;

         *             // 注:与未知id对应的idvalue设置为@_ID_VALUE,此处UserID未知。

         *             string sql1 = "insert into T_UserArea(UserID, AreaID) values(@_ID_VALUE, @areaid)";

         *             SqlParameter[] pram1 = 

         *             {

         *                 null, // 注:与未知id对应参数设置为空。

         *                 db.MakeInParam("@areaid", SqlDbType.Int, 4, areaid)

         *             };

         *             ......

         *  

         *             ArrayList arraySQL = new ArrayList();

         *             ArrayList arrayPram = new ArrayList();

         *             sqls.Add(sql1);

         *             prams.Add(pram1);

         *             .......

         *             

         *             int id = db.ExecuteReturnID(sqlOne, pramsOne, sqls, prams, "...methodName");

         * 

         *  返 回 值: int --> 执行成功,返回执行第一条语句所插入的一条记录的ID值。

         *                 --> 执行失败,返回-1。

         * 

         */

        /// <summary>

        /// 执行插入多个表的操作,第一个表(sqlOne)的主键为自动增长,若id=-1则插入失败

        /// 利用插入语句sqlOne得到的ID作为后面插入语句的属性之一

        /// 

        /// sqls和prams示例:

        ///            string sqlOne = "insert into T_User(...) values(...)"; // T_Userd的UserID自增。

        ///            SqlParameter[] pramsOne = {...};

        /// 

        ///            int areaid = 123;

        ///            // 注:与未知id对应的idvalue设置为@_ID_VALUE,此处UserID未知。

        ///            string sql1 = "insert into T_UserArea(UserID, AreaID) values(@_ID_VALUE, @areaid)";

        ///            SqlParameter[] pram1 = 

        ///            {

        ///                null, // 注:与未知id对应参数设置为空。

        ///                db.MakeInParam("@areaid", SqlDbType.Int, 4, areaid)

        ///            };

        ///            ......

        /// 

        ///            ArrayList arraySQL = new ArrayList();

        ///            ArrayList arrayPram = new ArrayList();

        ///            sqls.Add(sql1);

        ///            prams.Add(pram1);

        ///            .......

        ///            

        ///            int id = db.ExecuteReturnID(sqlOne, pramsOne, sqls, prams, "...methodName");

        /// 

        /// </summary>

        /// <param name="sqlOne">执行的第一条SQL语句</param>

        /// <param name="pramsOne">sqlOne语句对应的参数</param>

        /// <param name="sqls">连锁执行的SQL语句链表</param>

        /// <param name="prams">与sqls中每条SQL语句相对应的参数</param>

        /// <returns>

        /// int --> 执行成功,返回执行第一条语句所插入的一条记录的ID值。

        ///     --> 执行失败,返回-1。

        /// </returns>

        public int ExecuteReturnID(string sqlOne, SqlParameter[] pramsOne, ArrayList sqls, ArrayList prams, string callMethodName)

        {

            int id = -1; // 初始化id值为-1

            // 在第一条insert语句后加入select语句,以获得插入记录的ID值。

            sqlOne += ";select CAST( SCOPE_IDENTITY() AS INT) ";

            SqlCommand cmd = new SqlCommand();

            try

            {

                this.Open();

                cmd.Connection = this.connection;

                cmd.CommandText = sqlOne;

                for (int i = 0; i < pramsOne.Length; i++) // 插入对应参数。

                {

                    cmd.Parameters.Add(pramsOne[i]);

                }

                cmd.Transaction = connection.BeginTransaction(); // 事务开始

                id = (Int32)cmd.ExecuteScalar(); // 获得插入记录的ID。

                // 若sqls和prams不为空,则执行其中的操作。

                if (sqls != null && prams != null)

                {

                    // 检查参数中SQL语句sqls和参数prams是否对应,不对应则不执行操作,返回-1。

                    if (sqls.Count != prams.Count)

                    {

                        cmd.Transaction.Rollback();

                        Common.WriteExceptionMessage(callMethodName + "-->ExecuteRetureID(...): sqls.Count != prams.Count");

                        return -1;

                    }

                    // 从sqls和prams中获得需执行的SQL语句和与之对应的参数,逐条执行。

                    for (int i = 0; i < sqls.Count; i++)

                    {

                        string sqlTwo = (string)sqls[i];

                        SqlParameter[] pramsTwo = (SqlParameter[])prams[i];

                        cmd.CommandText = sqlTwo;

                        for (int j = 0; j < pramsTwo.Length; j++)

                        {

                            // 未知ID在SQL中约定使用@_ID_VALUE代替其值。

                            // 写入的参数组中,与未知ID对应项参数项约定设置为null,

                            // 此处将为null的参数替换为执行第一条insert语句获得插入记录的ID。

                            if (pramsTwo[j] == null)

                            {

                                pramsTwo[j] = this.MakeInParam("@_ID_VALUE", SqlDbType.Int, 4, id.ToString());

                            }

                            cmd.Parameters.Add(pramsTwo[j]);

                        }

                        cmd.ExecuteNonQuery();

                        // 执行多条insert语句可能会有同名参数,因此执行完一条后清除cmd中的参数。

                        cmd.Parameters.Clear();

                    }

                }

                cmd.Transaction.Commit();

            }

            catch (Exception ex)

            {

                id = -1; // 出现异常后为id赋值为-1,操作失败。

                cmd.Transaction.Rollback();

                Common.WriteExceptionMessage(callMethodName + "-->ExecuteRetureID(string sqlOne, SqlParameter[] pramsOne, ArrayList sqls,ArrayList prams,string callMethodName)", ex);

            }

            finally

            {

                this.Close();

            }

            return id;

        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////       

        /*  描    述: 构造函数

         *  输入参数: 无

         *  返 回 值: 无

         */

        /// <summary>

        /// 构造函数

        /// </summary>

        public Database()

        {

            try

            {

                if (connection == null)

                {

                   connection = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings[0]);

                }               

            }

            catch(Exception ex)

            {

                Common.WriteExceptionMessage("DataAccess-->Database-->Database()", ex);

            }

        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 打开数据库连接

         *  输入参数: 无

         *  返 回 值: 无

         */

        /// <summary>

        /// 打开数据库连接

        /// </summary>

        public void Open()

        {            

            try

            {

                if (connection!=null && connection.State == ConnectionState.Closed)

                {

                    connection.Open();

                }                

            }catch(Exception ex)

            {

                Common.WriteExceptionMessage("DataAccess-->Database-->Open()", ex);

            }            

               

        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 关闭数据库连接

         *  输入参数: 无

         *  返 回 值: 无

         */

        /// <summary>

        /// 关闭数据库连接

        /// </summary>

        public void Close()

        {            

            try

            {

                if (connection!=null && connection.State == ConnectionState.Open )

                {

                    connection.Close();

                }                

            }

            catch(Exception ex)

            {

                Common.WriteExceptionMessage("DataAccess-->Database-->Close()", ex); 

            }

            

        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////

         /*  描    述: 释放数据库连接

          *  输入参数: 无

          *  返 回 值: 无

          */

        /// <summary>

        /// 释放数据库连接

        /// </summary>

        public void Dispose()

        {           

            if (connection != null)

            {

                connection.Dispose();

                connection = null;

            }

        }

        //***************************************执行SQL语句  开始*********************************************

        //////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 执行不带参数的SQL语句:适应于update , delete ,add 三类SQL语句

         *  输入参数: 

         *  返 回 值: bool

         */

        /// <summary>

        /// 执行不带参数的SQL语句:适应于update , delete ,add 三类SQL语句

        /// </summary>

        /// <param name="sql"></param>

        /// <param name="callMethodName"></param>

        /// <returns>bool</returns>

        public bool ExecuteNonQuery(string sql, string callMethodName)

        {

            bool result = true;

            try

            {

                this.Open();

                SqlCommand command = new SqlCommand(sql, connection);

                command.ExecuteNonQuery();                

            }

            catch (Exception ex)

            {

                result = false;

                Common.WriteExceptionMessage(callMethodName + "-->ExecuteNonQuery", ex);

            }

            finally

            {

                this.Close();

            }

            return result;

        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 执行带有参数SQL语句:适应于update , delete ,add 三类SQL语句

         *  输入参数: 

         *  返 回 值: bool

         */

        /// <summary>

        /// 执行带有参数SQL语句:适应于update , delete ,add 三类SQL语句

        /// </summary>

        /// <param name="sql"></param>

        /// <param name="prams"></param>

        /// <param name="callMethodName"></param>

        /// <returns>bool</returns>

        public bool ExecuteNonQuery(string sql, SqlParameter[] prams,string callMethodName)

        {

            bool result = true;            

            try

            {

                this.Open();

                SqlCommand command=this.CreateCommandForSQL(sql, prams);

                command.ExecuteNonQuery();             

            }

            catch (Exception ex)

            {

                result = false;

                Common.WriteExceptionMessage(callMethodName+"-->ExecuteNonQuery", ex);

            }

            finally

            {

                this.Close();

            }

            return result;

        }

      

        //////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 执行不带参数的查询SQL语句

         *  输入参数: sql-->sql语句;

         *  返 回 值: dataTable-->返回的数据表

         */

        /// <summary>

        /// 执行不带参数的查询SQL语句

        /// </summary>

        /// <param name="sql"></param>

        /// <param name="callMethodName"></param>

        /// <returns>dataTable-->返回的数据表</returns>

        public DataTable ExecuteQuery(string sql,string callMethodName)

        {

           

            SqlDataReader dataReader = null;

            DataTable dataTable = new DataTable();            

            try

            {

                SqlCommand cmd = CreateCommandForSQL(sql, null);               

                dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);//System.Data.CommandBehavior.CloseConnection意味着:在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。

                dataTable = Common.ConvertDataReaderToDataTable(dataReader);

            }

            catch (Exception ex)

            {

                dataTable = null;

                Common.WriteExceptionMessage(callMethodName + "-->ExecuteQuery", ex);

            }

            finally

            {

                if (dataReader != null)

                {

                    dataReader.Close();

                }                

            }          

            return dataTable;

        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 执行带有参数的查询SQL语句

         *  输入参数: sql-->sql语句;

         *  返 回 值: dataTable-->返回的数据表

         */

        /// <summary>

        /// 执行带有参数的查询SQL语句

        /// </summary>

        /// <param name="sql"></param>

        /// <param name="prams"></param>

        /// <param name="callMethodName"></param>

        /// <returns>dataTable-->返回的数据表</returns>

        public DataTable ExecuteQuery(string sql, SqlParameter[] prams, string callMethodName)

        {

            SqlDataReader dataReader = null;

            DataTable dataTable = new DataTable();            

            try

            {

                SqlCommand cmd = CreateCommandForSQL(sql, prams);

                dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

                dataTable = Business.Common.ConvertDataReaderToDataTable(dataReader);

            }

            catch (Exception ex)

            {

                dataTable = null;

                Common.WriteExceptionMessage(callMethodName + "-->ExecuteQuery", ex);

            }

            finally

            {

                if (dataReader != null)

                {

                    dataReader.Close();  

                }                

            }

            return dataTable;            

                      

        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 执行一组不带参数的SQL语句 

         *  输入参数: sqlStrings:一组SQL语句 

         *  返 回 值: bool

         */

        /// <summary>

        /// 执行一组不带参数的SQL语句

        /// </summary>

        /// <param name="SqlStrings"></param>

        /// <param name="callMethodName"></param>

        /// <returns>bool</returns>

        public bool ExecuteNonQuerySQLS(ArrayList SqlStrings,String callMethodName)

        {

            bool result = true;

            this.Open();

            SqlCommand cmd = new SqlCommand();

            SqlTransaction trans = connection.BeginTransaction();

            cmd.Connection = connection;

            cmd.Transaction = trans;        

            try

            {

                foreach (String sql in SqlStrings)

                {

                    cmd.CommandText = sql;

                    cmd.ExecuteNonQuery();                   

                }

                trans.Commit();

            }

            catch (Exception ex)

            {

                result = false;

                trans.Rollback();

                Common.WriteExceptionMessage(callMethodName + "-->ExecuteNonQuerySQLS(ArrayList SqlStrings)", ex);

            }

            finally

            {

                this.Close();

            }

            return result;

        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 执行一组带有参数的SQL语句 

         *  输入参数: sqlStrings:一组SQL语句 

         *  返 回 值: bool

         */

        /// <summary>

        /// 执行一组带有参数的SQL语句

        /// </summary>

        /// <param name="SqlStrings"></param>

        /// <param name="prams"></param>

        /// <param name="callMethodName"></param>

        /// <returns>bool</returns>

        public bool ExecuteNonQuerySQLS(ArrayList SqlStrings,ArrayList prams, String callMethodName)

        {

            bool result = true;

            this.Open();

            SqlCommand cmd = new SqlCommand();

            SqlTransaction trans = connection.BeginTransaction();

            cmd.Connection = connection;

            cmd.Transaction = trans;

            try

            {               

                int sqlCount = SqlStrings.Count;

                for (int i = 0; i < sqlCount; i++)

                {

                    //生成cmd

                    cmd.CommandText = (string)SqlStrings[i];

                    if (prams[i] != null)

                    {

                        foreach (SqlParameter parameter in (SqlParameter[])prams[i])

                            cmd.Parameters.Add(parameter);

                    }

                    cmd.Parameters.Add(

                        new SqlParameter("ReturnValue", SqlDbType.Int, 4,

                        ParameterDirection.ReturnValue, false, 0, 0,

                        string.Empty, DataRowVersion.Default, null));

                    cmd.ExecuteNonQuery();

                    cmd.Parameters.Clear();

                    

                }

                trans.Commit();

            }

            catch (Exception ex)

            {

                result = false;

                trans.Rollback();

                Common.WriteExceptionMessage(callMethodName + "-->ExecuteNonQuerySQLS(ArrayList SqlStrings,ArrayList prams, String callMethodName)", ex);

            }

            finally

            {

                this.Close();

            }

            return result;

        }        

        //////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 创建Sqlcommand对象

         *  输入参数: 

         *  返 回 值: Sqlcommand-->Sqlcommand对象

         */

        /// <summary>

        /// 创建Sqlcommand对象

        /// </summary>

        /// <param name="sql"></param>

        /// <param name="prams"></param>

        /// <returns>qlcommand-->Sqlcommand对象</returns>

        private SqlCommand CreateCommandForSQL(string sql, SqlParameter[] prams)

        {

            this.Open();

            SqlCommand cmd = new SqlCommand(sql, connection);

            cmd.CommandType = CommandType.Text;

            if (prams != null)

            {

                foreach (SqlParameter parameter in prams)

                    cmd.Parameters.Add(parameter);

            }

            cmd.Parameters.Add(

                new SqlParameter("ReturnValue", SqlDbType.Int, 4,

                ParameterDirection.ReturnValue, false, 0, 0,

                string.Empty, DataRowVersion.Default, null));

            return cmd;

        }

       /////////////////////////////////////////////////////////////////////////////////////////////////////////

       /*  描    述: 创建输入类型的参数

        *  输入参数: ParamName-->参数名;DbType-->参数类型;Size-->参数大小;Value-->参数值

        *  返 回 值: SqlParamter对象

        */ 

        /// <summary>

        /// 创建输入类型的参数

        /// </summary>

        /// <param name="ParamName"></param>

        /// <param name="DbType"></param>

        /// <param name="Size"></param>

        /// <param name="Value"></param>

        /// <returns>SqlParamter对象</returns>

        public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)

        {

            return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);

        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////

       /*  描    述: 创建输出类型的参数

        *  输入参数: ParamName-->参数名;DbType-->参数类型;Size-->参数大小;Value-->参数值

        *  返 回 值: SqlParamter对象

        */

        /// <summary>

        /// 创建输出类型的参数

        /// </summary>

        /// <param name="ParamName"></param>

        /// <param name="DbType"></param>

        /// <param name="Size"></param>

        /// <returns>SqlParamter对象</returns>

        public SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size)

        {

            return MakeParam(ParamName, DbType, Size, ParameterDirection.Output, null);

        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////

        /*  描    述: 创建参数

         *  输入参数: ParamName-->参数名;DbType-->参数类型;Size-->参数大小;Direction-->参数方向;Value-->参数值

         *  返 回 值: SqlParamter对象

         */

        /// <summary>

        /// 创建参数

        /// </summary>

        /// <param name="ParamName"></param>

        /// <param name="DbType"></param>

        /// <param name="Size"></param>

        /// <param name="Direction"></param>

        /// <param name="Value"></param>

        /// <returns>SqlParamter对象</returns>

        public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)

        {

            SqlParameter param;

            if (Size > 0)

                param = new SqlParameter(ParamName, DbType, Size);

            else

                param = new SqlParameter(ParamName, DbType);

            param.Direction = Direction;

            if (!(Direction == ParameterDirection.Output && Value == null))

                param.Value = Value;

            return param;

        }

        /////////////////////////////////////////////////////////////////////////////////////////////////

        #region IDisposable 成员

        /// <summary>

        /// 

        /// </summary>

        void IDisposable.Dispose()

        {

            throw new Exception("The method or operation is not implemented.");

        }

        #endregion

    }

}

抱歉!评论已关闭.