不妥的地方 不规范的地方请大家指出   
或者请大家也发一个简单的DbHelper 模块我看看,谢谢!   public class DbHelper
    {
        private static SqlConnection scon;
        public static string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];        public static SqlConnection GetDBconnection
        {
            get
            {
                if (scon == null)
                {
                    scon = new SqlConnection(ConnectionString);
                    try
                    {
                        scon.Open();
                    }
                    catch (Exception)
                    {
                    }
                }
                else switch (scon.State)
                    {
                        case ConnectionState.Closed:
                            scon.Open();
                            break;
                        case ConnectionState.Broken:
                            scon.Close();
                            scon.Open();
                            break;
                    }
                return scon;
            }
        }        /// <summary>
        /// 执行语句
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int ExecuteSql(string sql)
        {
            try
            {
                using (SqlCommand scom = new SqlCommand(sql, GetDBconnection))
                {
                    int result = Convert.ToInt32(scom.ExecuteNonQuery());
                    return result;
                }
            }
            catch (SqlException ex)
            {
                scon.Close();
                throw ex; ;
            }
            finally
            {
                scon.Close();     //添加
            }
        }        /// <summary>
        /// 返回记录
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public DataTable Getdatatable(string sql)
        {
            try
            {
                DataSet ds = new DataSet();
                ds.CaseSensitive = false;
                using (SqlCommand scom = new SqlCommand(sql, GetDBconnection))
                {
                    SqlDataAdapter sda = new SqlDataAdapter(scom);
                    sda.Fill(ds);
                    sda.Dispose();
                    return ds.Tables[0];
                }
            }
            catch (SqlException ex)
            {
                throw ex;
            }
        }
    }

解决方案 »

  1.   

    挺好的,我的DBHelper模块是每一个都有一个sqlconnection的open和close,因为在你执行一个查询语句的同时,如果想更新数据库的话,全局公用一个sqlconnection,会报错的。楼主还可以搞一个只查询一条数据,返回object的方法,也是有用的
      

  2.   

    因为在你执行一个查询语句的同时,如果想更新数据库的话,全局公用一个sqlconnection,会报错的。
    是不是因为查询没有关闭,会使更新报错!!!不定义公用全局的话,
    每个上面加 
    using(sqlconnection conntion =new sqlconnection(ConnectionString))
    {}
    那我这个定义就可以不要了
    public static SqlConnection GetDBconnection
            {
    }
    请帮助看看怎么改了,感谢!
      

  3.   

    不要把sqlconnection 共享, 你可以把 连接字符串共享.
      

  4.   

        /// <summary>
        /// SQLServer 帮助类
        /// </summary>
        public class SQLHelper
        {
            //定义对象
            private SqlConnection conn = null;
            private SqlCommand cmd = null;
            private SqlDataAdapter sda = null;
            private DataSet ds = null;        //定义连接字符串
            private string connStr = "server=.;database=MyMemoDB;uid=sa;pwd=123456";        /// <summary>
            /// 得到所有备忘录
            /// </summary>
            /// <returns>备忘录DataSet</returns>
            public DataSet SearchAll(string sql)
            {
                try
                {
                    using (conn = new SqlConnection(connStr))
                    { 
                        //打开
                        conn.Open();
                        //创建命令对象
                        cmd = new SqlCommand(sql,conn);
                        //创建适配器
                        sda = new SqlDataAdapter(cmd);
                        //创建数据集
                        ds = new DataSet();
                        //填充
                        sda.Fill(ds);                    return ds;
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    这只是我一般写的一个简单的例子。。
      

  5.   

    我电脑上面有两个系统这个系统没有装工具
    按你的代码 直接修改的public class DbHelper
         {
             privatestatic string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];         //可以直接封装SqlCommand
             public SqlCommand GetComm()
            {
               SqlCommand comm = new SqlCommand();
               comm.CommandText = sql;
               comm.Connection = new SqlConnection(ConnectionString);
               return comm;
            }
             
             
             /// <summary>
             /// 执行语句
               /// </summary>
             /// <param name="sql"></param>
             /// <returns></returns>
             public int ExecuteSql(string sql)
             {
                     using (SqlCommand scom = GetComm(sql))
                     {
                         using(scom.Connection)
                         {
                             scom.Connection.Open();
                             int result = Convert.ToInt32(scom.ExecuteNonQuery());
                             return result;
                         }
                      }
             }         /// <summary>
             /// 返回记录
            /// </summary>
             /// <param name="sql"></param>
             /// <returns></returns>
             public DataTable Getdatatable(string sql)
             {
                 try
                 {
                     DataSet ds = new DataSet();
                     ds.CaseSensitive = false;
                     using (SqlCommand scom = GetComm(sql))
                     {
                         SqlDataAdapter sda = new SqlDataAdapter(scom);
                         sda.Fill(ds);
                         sda.Dispose();
                         return ds.Tables[0];
                     }
                 }
                 catch (SqlException ex)
                 {
                     throw ex;
                 }
             }
         } 
    基本上再往后面添加方法都是一样的,传递给GetComm()方法一个sql语句就可以了
      

  6.   

             /// <summary>
             /// 执行语句
               /// </summary>
             /// <param name="sql"></param>
             /// <returns></returns>
             public int ExecuteSql(string sql)
             {
                     using (SqlCommand scom = GetComm(sql))
                     {
                         using(scom.Connection)
                         {
                             scom.Connection.Open();
                             int result = Convert.ToInt32(scom.ExecuteNonQuery());
                             return result;
                         }
                      }
             } 不需要关闭 Connection();
      

  7.   

    我也是新手,一般这么写,大家互相学习!
        public class Date
        {
            string constr = string.Format("Data Source=   ;Initial Catalog=  ;User Id=  ;Password=  ;");
            ///执行数据库操作
            #region
            /// <summary>
            /// 执行一般SQL操作
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns>影响行数</returns>
            public bool ExecuteSql(string sql)
            {
                try
                {
                    SqlConnection sqlcon = new SqlConnection(constr);
                    SqlCommand command = new SqlCommand(sql, sqlcon);
                    sqlcon.Open();
                    int resulr = command.ExecuteNonQuery();
                    sqlcon.Close();
                    sqlcon.Dispose();
                    if (resulr > 0)
                        return true;
                    else
                        return false;
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
            }
            /// <summary>
            /// 执行获取数据集的操作
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns>数据集</returns>
            public DataSet GetData(string sql)
            {
                try
                {
                    SqlConnection sqlcon = new SqlConnection(constr);
                    SqlCommand cmd = new SqlCommand(sql, sqlcon);
                    sqlcon.Open();
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    adapter.Fill(ds, "Table");
                    sqlcon.Close();
                    sqlcon.Dispose();
                    return ds;
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
            }
    }
      

  8.   

    写个基础方法,把SqlConnection作为参数传递进去,确保通用性。然后再写个扩展方法,方法内创建新的SqlConnection并调用基础方法。这样的好处是,如果想偷懒少写个连接参数,就用扩展方法,而如果想保持事务或提高性能,用同一个连接做多个操作,就自己创建SqlConnection,调用基础方法。
      

  9.   


    我这样写公用它 不对吗???? 请大师改改!
            public static SqlConnection GetDBconnection
            {
                get
                {
                    if (scon == null)
                    {
                        scon = new SqlConnection(ConnectionString);
                        try
                        {
                            scon.Open();
                        }
                        catch (Exception)
                        {
                        }
                    }
                    else switch (scon.State)
                        {
                            case ConnectionState.Closed:
                                scon.Open();
                                break;
                            case ConnectionState.Broken:
                                scon.Close();
                                scon.Open();
                                break;
                        }
                    return scon;
                }
            }
      

  10.   

            public static string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"];            using (SqlConnection connection = new SqlConnection(ConnectionString))
                {
                    using (SqlCommand scom = new SqlCommand(sql, connection))
                    {
                        try
                        {
                            connection.Open();
                            int rows = scom.ExecuteNonQuery();
                            return rows;
                        }
                        catch (SqlException ex)
                        {
                            connection.Close();
                            throw ex;
                        }
                    }
                }
      

  11.   

    connection对象最好不要一直打开应该在在需要的时候打开,一但数据库操作完毕,立即关闭,释放资源
      

  12.   


    +1请用这个帮助我改改,谢谢!!
    网上百度 微软DbHelp类 . 有现成的 .
    看了你这个数据访问操作底层类 .  建议你 把连接字符穿共享.
    每个sqlconnection 最好在每一个方法中就得释放.每个方法有独自的sqlconnection.
      

  13.   

    试想:如果所执行的SQL需要参数,你的接口如果满足,难不成你直接拼好的SQL给接口方法吗(注意SQL注入)?
      

  14.   

    如果用 MSSQL 的话,加上 EntLib 中 DBApplicationBlock 的 DBFactory ,就简单很多了!还能直接用 DBApplicationBlock 的其他方法。要加 事务之类 都简单很多!
      

  15.   

    不要把SqlConnection上升到类的级别,这样会存在各种隐患。
    一定要在方法中随时用随时创建和销毁。
    你可以参考我写的这个类:
    http://www.cnblogs.com/lifeil/archive/2013/04/16/3024161.html
      

  16.   

    不要把SqlConnection上升到全局的级别,那样多线程操作时会出现意想不到的问题。一个SQLHelper拥有自己的SqlConnection是可以的,但是多个SQLHelper共享同一个SqlConnection肯定有问题,你不能保证他们都在同一个线程中工作。