DBHelper.ASP.NET解决思路

DBHelper.......ASP.NET

using Model;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace DAL
{
    public static class DbHelper
    {
        private static string GetConString = ConfigurationManager.ConnectionStrings["DbConnString"].ConnectionString.ToString();
        private static SqlConnection conn = new SqlConnection(GetConString);

        #region 初始化参数值
        /// <summary>
        /// 初始化参数值
        /// </summary>
        /// <param name="ParamName">存储过程名称或命令文本</param>
        /// <param name="DbType">参数类型</param>
        /// <param name="Size">参数大小</param>
        /// <param name="Direction">参数方向</param>
        /// <param name="Value">参数值</param>
        /// <returns>新的 parameter 对象</returns>
        public static SqlParameter GetSqlParameter(string ParamName, SqlDbType DbType, int Size, object Value, ParameterDirection Direction)
        {
            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;
        }
        //公有方法,实例化一个用于调用存储过程的输入参数
        //输入:
        //     ParamName - 参数名称
        //     DbType   -  参数类型
        //     Size     - 参数大小 
        //     Value     - 值
        public static SqlParameter GetSqlParameter(string ParamName, SqlDbType DbTpye, int Size, object Value)
        {
            return GetSqlParameter(ParamName, DbTpye, Size, Value, ParameterDirection.Input);
        }
        #endregion

        #region 打开数据连接
        /// <summary>
        /// 获取连接对象
        /// </summary>
        /// <returns></returns>
        public static void OpenConnection()
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
        }
        #endregion

        #region 关闭数据连接
        /// <summary>
        /// 关闭数据连接
        /// </summary>
        /// <returns></returns>
        public static void CloseConnection()
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }
        #endregion

        #region 获取命令对象
        /// <summary>
        /// 获取命令对象
        /// </summary>
        /// <param name="strSql">执行的SQL语句</param>
        /// <returns></returns>
        public static SqlCommand GetCommand(string strSql, CommandType commandType, SqlParameter[] parameters)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = commandType;
            cmd.CommandText = strSql;
            if (parameters != null)
            {
                foreach (SqlParameter parameter in parameters)
                {
                    cmd.Parameters.Add(parameter);
                }
            }
            return cmd;
        }
        #endregion

        #region 执行一个查询,并返回结果集

     
    

     
        #region 执行一个查询,并返回查询结果
        /// <summary>  
        /// 执行一个查询,并返回查询结果
        /// </summary>  
        /// <param name="sql">要执行的sql语句</param>  
        /// <param name="commandtype">要执行查询语句的类型,如存储过程或者sql文本命令</param>  
        /// <param name="parameters">Transact-SQL语句或者存储过程参数数组</param>  
        /// <returns></returns>  
        public static DataTable ExecuteDataTable(string sql, CommandType commandtype, SqlParameter[] parameters)
        {
            DataTable data = new DataTable(); //实例化datatable,用于装载查询结果集
            SqlDataAdapter adapter = null;
            SqlCommand cmd = GetCommand(sql, commandtype, parameters);
            try
            {
                OpenConnection();
                adapter = new SqlDataAdapter("", conn);
                adapter.Fill(data);//填充datatable  
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                cmd.Parameters.Clear();
                CloseConnection();
                adapter.Dispose();
                cmd.Dispose();
            }
            return data;
        }
        #endregion

        #endregion

        #region 返回一个SqlDataReader对象的实例
     
        #region 返回一个sqldatareader对象的实例
        /// <summary>  
        /// 返回一个sqldatareader对象的实例  
        /// </summary>  
        /// <param name="sql"></param>  
        /// <param name="commandType"></param>  
        /// <param name="parameters"></param>  
        /// <returns></returns>  
        public static SqlDataReader ExecuteReader(string sql, CommandType commandType, SqlParameter[] parameters)
        {
            SqlCommand cmd = GetCommand(sql, commandType, parameters);
            OpenConnection();
            //CommandBehavior.CloseConnection参数指示关闭reader对象时关闭与其关联的Connection对象  
            //SqlDataReader reader = cmd.ExecuteReader();
            SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return reader;
        }
        #endregion

        #endregion

        #region 执行一个查询,返回结果集的首行首列。忽略其他行,其他列
         /// <summary>  
        /// 执行一个查询,返回结果集的首行首列。忽略其他行,其他列  
        /// </summary>  
        /// <param name="sql"></param>  
        /// <param name="commandType">参数类型</param>  
        /// <param name="parameters"></param>  
        /// <returns></returns>  
        public static string ExecuteScalar(string sql, CommandType commandType, SqlParameter[] parameters)
        {
            object result = null;
            SqlCommand cmd = GetCommand(sql, commandType, parameters);
            try
            {
                OpenConnection();
                result = cmd.ExecuteScalar();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                CloseConnection();
                cmd.Dispose();
                cmd.Parameters.Clear();
            }
            return Convert.ToString(result);
        }
        #endregion

        #region 对数据库进行增删改的操作
           /// <summary>  
        /// 对数据库进行增删改的操作  
        /// </summary>  
        /// <param name="sql">要执行的sql语句</param>  
        /// <param name="commandType">要执行的查询语句类型,如存储过程或者sql文本命令</param>  
        /// <param name="parameters">Transact-SQL语句或者存储过程的参数数组</param>  
        /// <returns></returns>  
        public static int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters)
        {
            int count = 0;
            SqlCommand cmd = GetCommand(sql, commandType, parameters);
            try
            {
                OpenConnection();
                count = cmd.ExecuteNonQuery();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                CloseConnection();
                cmd.Dispose();
                cmd.Parameters.Clear();
            }
            return count;
        }
        #endregion

        #region 执行事务,返回受影响的行数
        /// <summary>
        /// 执行事务,返回受影响的行数
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="commandType"></param>
        /// <param name="parameters"></param>
        public static int GetTransactionDataTable(string sql, CommandType commandType, SqlParameter[] parameters)
        {
            int result = 0;
            SqlTransaction myTrans = null;
            SqlCommand cmd = GetCommand(sql, commandType, parameters);
            try
            {
                OpenConnection();
                myTrans = conn.BeginTransaction(); //使用New新生成一个事务
                cmd.Transaction = myTrans;
                result = cmd.ExecuteNonQuery();
                myTrans.Commit();
            }
            catch (Exception)
            {
                myTrans.Rollback();
            }
            finally
            {
                CloseConnection();
                cmd.Dispose();
                cmd.Parameters.Clear();
            }
            return result;
        }
        #endregion
    }
}

自己写的DBHelper好像有不对的地方,,,请各位大神做下点评啊
------解决思路----------------------
SqlConnection conn = new SqlConnection(GetConString);应该作为局部变量,而不是放在全局,而且你写的还是静态的,静态的对象就是内存中只有一份数据,根据引用类型知识,如果两个人同时浏览网页,第二个人先比第一个人访问完毕,那个第一个人再执行SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);这段代码时,实际上数据库连接已经被第二个人访问了后关闭了,导致错误。一般访问人多的时候就会发现,一两个人一般不容易发现。