using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;namespace Utility
{
    /// <summary>
    /// 数据库访问通用类    .
    /// </summary>
    public static class SqlHelper
    {
        private static SqlConnection connection;
        public static SqlConnection Connection
        {
            get
            {
                string connectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
                if (connection == null)
                {
                    connection = new SqlConnection(connectionString);
                    connection.Open();
                }
                else if (connection.State == ConnectionState.Closed)
                {
                    connection.Open();
                }
                else if (connection.State == ConnectionState.Broken)
                {
                    connection.Close();
                    connection.Open();
                }
                return connection;
            }
        }        /// <summary>
        /// 执行一个增删改存储过程(无参),返回影响行数
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <returns>影响行数</returns>
        public static int ExecuteNonQueryByProc(string procName)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            int affected = cmd.ExecuteNonQuery();
            connection.Close();
            return affected;
        }        /// <summary>
        /// 执行一个增删改存储过程(有参),返回影响行数
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <param name="parms">可变参数数组</param>
        /// <returns>影响行数</returns>
        public static int ExecuteNonQueryByProc(string procName, params SqlParameter[] parms)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parms);
            int affected = cmd.ExecuteNonQuery();
            connection.Close();
            return affected;
        }        /// <summary>
        /// 执行一个查询存储过程(无参),返回int
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <returns>int</returns>
        public static int ExecuteScalarGetIntByProc(string procName)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            int result = Convert.ToInt32(cmd.ExecuteScalar());
            connection.Close();
            return result;
        }        /// <summary>
        /// 执行一个查询存储过程(有参),返回int
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <param name="parms">可变参数数组</param>
        /// <returns>int</returns>
        public static int ExecuteScalarGetIntByProc(string procName, params SqlParameter[] parms)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parms);
            int result = Convert.ToInt32(cmd.ExecuteScalar());
            connection.Close();
            return result;
        }        /// <summary>
        /// 执行一个查询存储过程(无参),返回string
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <returns>string</returns>
        public static string ExecuteScalarGetStringByProc(string procName)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            string result = Convert.ToString(cmd.ExecuteScalar());
            connection.Close();
            return result;
        }        /// <summary>
        /// 执行一个查询存储过程(有参),返回string
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <param name="parms">可变参数数组</param>
        /// <returns>string</returns>
        public static string ExecuteScalarGetStringByProc(string procName,params SqlParameter[] parms)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parms);
            string result = Convert.ToString(cmd.ExecuteScalar());
            connection.Close();
            return result;
        }        /// <summary>
        /// 执行一个查询存储过程(无参),返回DataReader,注意用完后要关闭连接
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <returns>SqlDataReader</returns>
        public static SqlDataReader ExecuteReaderByProc(string procName)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            return cmd.ExecuteReader();
        }        /// <summary>
        /// 执行一个查询存储过程(有参),返回DataReader,注意用完后要关闭连接
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <param name="parms">可变参数数组</param>
        /// <returns>SqlDataReader</returns>
        public static SqlDataReader ExecuteReaderByProc(string procName, params SqlParameter[] parms)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parms);
            return cmd.ExecuteReader();
        }
        
        /// <summary>
        /// 执行一个查询存储过程(无参),返回DataTable
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <returns>DataTable</returns>
        public static DataTable AdapterGetDataTableByProc(string procName)
        {
            DataSet ds = new DataSet();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = procName;
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            adp.Fill(ds);
            DataTable dt = ds.Tables[0];
            connection.Close();
            return dt;
        }        /// <summary>
        /// 执行一个查询存储过程(有参),返回DataTable
        /// </summary>
        /// <param name="procName">存储过程名字</param>
        /// <param name="parms">可变参数数组</param>
        /// <returns>DataTable</returns>
        public static DataTable AdapterGetDataTableByProc(string procName, params SqlParameter[] parms)
        {
            DataSet ds = new DataSet();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = procName;
            cmd.Parameters.AddRange(parms);
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            adp.Fill(ds);
            DataTable dt = ds.Tables[0];
            connection.Close();
            return dt;
        }    
    }
}
因为这次做的项目是要投入使用的(第一次啊……),所以很担心效率、安全性等问题,请大家来看看,这个通用类有没有什么问题或者不足,欢迎指正啊,谢谢!!!

解决方案 »

  1.   

    不赞成connection做成static的并发的话,这个helper就不支持了。
      

  2.   


    有这个问题啊?因为我做asp.net属于半路出家、迫于无奈,所以还有很多问题不懂,这个static我就一直没弄明白……是不是去掉static就可以了?
      

  3.   

    把connection放到方法中去。
    public static SqlConnection Connection 这个属性也没必要公开了。自己练习的话是好事,做项目的话这个封装类不是有点重复造轮子的意思?
    直接用微软的SqlHelper类就可以了。或者直接用Linq2Entity。
      

  4.   

    微软的sqlhelper 记得刚开始研究的时候也找来看了 全英文注释 当时就给吓住了……
      

  5.   

    挺好的。
    你的代码  ---- private static SqlConnection connection;就是定义一个静态数据库连接,但该连接还没赋值,当你赋值以后,例如:
    应该没有什么问题。
      

  6.   


    写成static 并发会有问题吗?
    那应该如何写?
      

  7.   

    我大学的时候也总结了一个拼一下using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    using System.Collections;namespace M_Common.SqlHelper
    {    /******************************    ******************************/
        public class SqlHelper
        {
            private static SqlConnection cn = null;
            private static SqlCommand cmd = null;        public SqlHelper()
            {        }        /// <summary>
            /// 判断连接状态
            /// </summary>
            /// <returns>返回连接状态</returns>
            private static SqlConnection GetConn()
            {
                string ConnStr = M_Common.Helper.ConfigHelper.GetconnMsSql.ToString();
                cn = new SqlConnection(ConnStr);
                if (cn.State != ConnectionState.Open)
                {
                    cn.Open();
                }
                return cn;
            }
            /// <summary>
            /// 获取某表的某个字段的最大值
            /// </summary>
            /// <param name="FieldName">字段名</param>
            /// <param name="TableName">表明</param>
            /// <returns>返回最大值</returns>
            public static int GetMaxID(string FieldName, string TableName)
            {
                string strsql = "select max(" + FieldName + ")+1 from " + TableName;
                object obj = SqlHelper.GetSingle(strsql);
                if (obj == null)
                {
                    return 1;
                }
                else
                {
                    return int.Parse(obj.ToString());
                }
            }
            /// <summary>
            /// 执行一条计算查询结果语句,返回查询结果(object)。
            /// </summary>
            /// <param name="SQLString">计算查询结果语句</param>
            /// <returns>查询结果(object)</returns>
            public static object GetSingle(string SQLString)
            {
                using (SqlCommand cmd = new SqlCommand(SQLString, GetConn()))
                {
                    try
                    {
                        object obj = cmd.ExecuteScalar();
                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (System.Data.SqlClient.SqlException e)
                    {
                        throw e;
                    }
                }        }        /// <summary>
            /// 带参数返回一行一列ExecuteScalar
            /// </summary>
            /// <param name="cmdtext">存储过程或者SQL语句</param>
            /// <param name="para">参数数组</param>
            /// <param name="ct">命令类型</param>
            /// <returns>返回一行一列value</returns>
            public static int ExecuteScalar(string cmdtext, SqlParameter[] para, CommandType ct)
            {
                int value;
                try
                {
                    cmd = new SqlCommand(cmdtext, GetConn());
                    cmd.CommandType = ct;
                    cmd.Parameters.AddRange(para);
                    value = Convert.ToInt32(cmd.ExecuteScalar());
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (cn.State == ConnectionState.Open)
                    {
                        cn.Close();
                    }
                }
                return value;
            }
            /// <summary>
            /// 执行无参的操作
            /// </summary>
            /// <param name="cmdtext">SQL语句或存储过程</param>
            /// <param name="ct">CMD的类型</param>
            /// <returns>处理后的值</returns>
            public static int ExecuteNonQuery(string cmdtext, CommandType ct)
            {
                int value;
                try
                {
                    cmd = new SqlCommand(cmdtext, GetConn());
                    cmd.CommandType = ct;
                    value = cmd.ExecuteNonQuery() > 0 ? 1 : 0;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (cn.State == ConnectionState.Open)
                    {
                        cn.Close();
                    }
                }
                return value;
            }        /// <summary>
            /// 执行带参的增.删.改操作
            /// </summary>
            /// <param name="cmdtext">SQL语句或存储过程</param>
            /// <param name="para">参数数组</param>
            /// <param name="ct">CMD类型</param>
            /// <returns>处理后的值</returns>
            public static int ExecuteNonQuery(string cmdtext, SqlParameter[] para, CommandType ct)
            {
                int value;
                using (cmd = new SqlCommand(cmdtext, GetConn()))
                {
                    cmd.CommandType = ct;
                    cmd.Parameters.AddRange(para);
                    value = cmd.ExecuteNonQuery() > 0 ? 1 : 0;
                }
                return value;
            }        /// <summary>
            /// 执行无参的查询 返回DataTable
            /// </summary>
            /// <param name="cmdtext">存储过程名称或SQL语句</param>
            /// <param name="ct">命令类型</param>
            /// <returns>返回DataTable</returns>
            public static DataTable ReturnDataTable(string cmdtext, CommandType ct)
            {
                DataTable dt = new DataTable();
                cmd = new SqlCommand(cmdtext, GetConn());
                //类型
                cmd.CommandType = ct;
                SqlDataReader dr = null;
                //连接池 读完自动释放Connection
                using (dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    //用委托填充DataTable
                    dt.Load(dr);
                }
                return dt;
            }        /// <summary>
            /// 执行有参的查询 返回DataTable
            /// </summary>
            /// <param name="cmdtext">存储过程名称或SQL语句</param>
            /// <param name="ct">命令类型</param>
            /// <param name="para">参数数组</param>
            /// <returns>返回DataTable</returns>
            public static DataTable ReturnDataTable(string cmdtext, CommandType ct, SqlParameter[] para)
            {
                DataTable dt = new DataTable();
                cmd = new SqlCommand(cmdtext, GetConn());
                //类型
                cmd.CommandType = ct;
                //参数数组
                cmd.Parameters.AddRange(para);
                SqlDataReader dr = null;
                //连接池 读完自动释放Connection
                using (dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    //用委托填充DataTable
                    dt.Load(dr);
                }
                return dt;
            }        /// <summary>
            /// 执行无参的查询 返回DataSet
            /// </summary>
            /// <param name="cmdtext">存储过程名称或SQL语句</param>
            /// <param name="ct">命令类型</param>
            /// <returns>返回DataSet</returns>
            public static DataSet ReturnDataSet(string cmdtext, CommandType ct)
            {
                cmd = new SqlCommand(cmdtext, GetConn());
                //类型
                cmd.CommandType = ct;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                try
                {
                    da.Fill(ds);
                }
                catch (Exception err)
                {                throw err;
                }
                finally
                {
                    if (cn.State != ConnectionState.Closed)
                    {
                        cn.Close();
                    }
                }
                return ds;
            }
            /// <summary>
            /// 执行有参的查询 返回DataSet
            /// </summary>
            /// <param name="cmdtext">存储过程名称或SQL语句</param>
            /// <param name="ct">命令类型</param>
            /// <param name="para">参数数组</param>
            /// <returns>返回DataSet</returns>
            public static DataSet ReturnDataSet(string cmdtext, CommandType ct, SqlParameter[] para)
            {
                cmd = new SqlCommand(cmdtext, GetConn());
                //类型
                cmd.CommandType = ct;
                //参数数组
                cmd.Parameters.AddRange(para);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                try
                {
                    da.Fill(ds);
                }
                catch (Exception err)
                {                throw err;
                }
                finally
                {
                    if (cn.State != ConnectionState.Closed)
                    {
                        cn.Close();
                    }
                }
                return ds;
            }    }
    }
      

  8.   

    大企业应用使用企业库
    小企业可以用微软的sqlhelper.cs搞定,参考:微软SqlHelper类