萬能DBHelper類

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Collections;


namespace CBAHotelDAL
{
    public static class DBHelper
    {
        /// <summary>
        /// 獲取配置文件中的連接字符串
        /// </summary>
        ///
        public static string ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        /// <summary>
        /// 打開連接(如果之前未打開),並且創建一個可以立即執行的 SqlCommand 對象。
        /// 該方法主要在 DBHelper 內部使用
        /// </summary>
        public static SqlCommand CreateCommand(string commandText, SqlConnection con)
        {
            if (con.State != ConnectionState.Open)
                con.Open();
            return new SqlCommand(commandText, con);
        }

        /// <summary>
        /// 執行查詢(SELECT)語句。
        /// </summary>
        /// <param name="commandText">SELECT 語句</param>
        /// <param name="con">連接對象。不需要事先打開(但要先實例化(new)),也不需要顯式關閉。</param>
        /// <returns>包含查詢結果的 SqlDataReader 對象</returns>
        public static SqlDataReader ExecuteReader(string commandText, SqlConnection con)
        {
            // 訂閱事件,用於調試連接狀態
            con.StateChange += new StateChangeEventHandler(con_StateChange);
            SqlCommand cmd = CreateCommand(commandText, con);
            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return dr;
        }

        /// <summary>
        /// 執行查詢(SELECT)存儲過程。
        /// </summary>
        /// <param name="procedureName">存儲過程</param>
        /// <param name="con">連接對象。不需要事先打開(但要先實例化(new)),也不需要顯式關閉。</param>
        /// <param name="parameters">存儲過程的參數</param>
        /// <returns>包含查詢結果的 SqlDataReader 對象</returns>
        public static SqlDataReader ExecuteReader(string procedureName, SqlConnection con, SqlParameter[] parameters)
        {
            // 訂閱事件,用於調試連接狀態
            con.StateChange += new StateChangeEventHandler(con_StateChange);
            SqlCommand cmd = CreateCommand(procedureName, con);
            cmd.CommandType = CommandType.StoredProcedure;
            if (parameters != null)
                for (int i = 0; i < parameters.Length; i++)
                    cmd.Parameters.Add(parameters[i]);
            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return dr;
        }

        /// <summary>
        /// 執行增(INSERT)刪(DELETE)改(UPDATE)語句。
        /// 這個方法自己會創建連接、打開連接並且自動關閉連接。
        /// </summary>
        /// <param name="commandText">SQL 語句</param>
        public static void ExecuteNonQuery(string commandText)
        {
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                // 訂閱事件,用於調試連接狀態
                con.StateChange += new StateChangeEventHandler(con_StateChange);
                SqlCommand cmd = CreateCommand(commandText, con);
                cmd.ExecuteNonQuery();
            }
        }
        /// <summary>
        /// 查詢返回單個值
        /// </summary>
        /// <param name="commandText"></param>
        /// <returns></returns>
        public static object ExecuteScalar(string commandText)
        {
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
             con.StateChange+=new StateChangeEventHandler(con_StateChange);
             SqlCommand cmd = CreateCommand(commandText, con);
             return cmd.ExecuteScalar();
            }

        }

        /// <summary>
        /// 執行增(INSERT)刪(DELETE)改(UPDATE)存儲過程。
        /// 這個方法自己會創建連接、打開連接並且自動關閉連接。
        /// </summary>
        /// <param name="procedureName">存儲過程名</param>
        /// <param name="parameters">存儲過程的參數</param>
        public static void ExecuteNonQuery(string procedureName, SqlParameter[] parameters)
        {
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                // 訂閱事件,用於調試連接狀態
                con.StateChange += new StateChangeEventHandler(con_StateChange);
                SqlCommand cmd = CreateCommand(procedureName, con);
                cmd.CommandType = CommandType.StoredProcedure;
                if (parameters != null)
                    for (int i = 0; i < parameters.Length; i++)
                        cmd.Parameters.Add(parameters[i]);
                cmd.ExecuteNonQuery();
            }
        }

        public static void ExecuteTransaction(ArrayList sqls, SqlTransaction sqlT)
        {
            using (SqlConnection con = new SqlConnection(DBHelper.ConnectionString))
            {
                con.Open();
                sqlT = con.BeginTransaction(IsolationLevel.ReadCommitted);
                SqlCommand cmd = con.CreateCommand();
                cmd.Transaction = sqlT;
                try
                {
                    //循環事務中語句
                    foreach (string sVal in sqls)
                    {
                        cmd.CommandText = sVal;
                        cmd.ExecuteNonQuery();
                    }
                    //完成後確認事務
                    sqlT.Commit();
                }
                catch (Exception ex)
                {
                    //出錯後回滾事務
                    sqlT.Rollback();
                    throw ex;
                }
                finally
                {
                    con.Close();
                }
            }         
        }
        /// <summary>
        /// 這個方法用於調試連接狀態。
        /// </summary>
        static void con_StateChange(object sender, StateChangeEventArgs e)
        {
            SqlConnection conSender = sender as SqlConnection;

            System.Diagnostics.Debug.WriteLine("連接狀態改變:" + e.OriginalState.ToString() + " => " + e.CurrentState.ToString());
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章