我有一个数据库访问类:
public class SqlHelper
    {        private static SqlConnection connection = null;        private static String conString = "server=192.168.0.1;User ID=sa;Password=;database=HrSysTool;Connection Reset=FALSE";        public static SqlConnection Connection
        {
            get
            {
                if (connection == null)
                {
                    //重新创建
                    connection = SqlHelper.ConnectionDB();
                }
                if (connection != null && connection.State == ConnectionState.Closed)
                {
                    //重新连接
                    connection.Open();
                }
                return connection;
            }
        }        public static SqlConnection ConnectionDB()
        {             
            SqlConnection conn = null;
            try
            {
                conn = new SqlConnection(conString);
                conn.Open();
                SqlHelper.connection = conn;
            }
            catch
            {
                throw new Exception("未配置数据源连接信息!");
                SqlHelper.connection = null;
            }                        return conn;
        }        /// <summary>
        /// 关闭数据连接
        /// </summary>
        /// <returns></returns>
        public static bool DisConnectionDB()
        {
            try
            {
                if (SqlHelper.connection != null && SqlHelper.connection.State != ConnectionState.Closed)
                {
                    //关闭数据源                    SqlHelper.connection.Close();
                }
                SqlHelper.connection = null;
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }        /// <summary>
        /// 查询方法,适用于返回DataSet数据的SQL语句,使用当前系统的Connection
        /// </summary>
        /// <param name="cmdType">Command类型</param>
        /// <param name="cmdText">SQL脚本</param>
        /// <param name="commandParameters">SQL参数集合</param>
        /// <returns>返回DataSet数据集</returns>
        public static DataSet FillDataSet(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            SqlConnection conn = SqlHelper.Connection;
            DataSet dataSet = new DataSet();            try
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
                dataAdapter.Fill(dataSet);
                cmd.Parameters.Clear();
                return dataSet;
            }
            catch
            {                
                throw;
            }
        }        /// <summary>
        /// 执行方法,适用于不返回数据的SQL语句,使用当前系统的Connection
        /// </summary>
        /// <param name="cmdType">Command类型</param>
        /// <param name="cmdText">SQL脚本</param>
        /// <param name="commandParameters">SQL参数集合</param>
        /// <returns>返回影响的行数</returns>
        public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {            SqlCommand cmd = new SqlCommand();            using (SqlConnection conn = SqlHelper.Connection)
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }        /// <summary>
        /// 执行方法,适用于不返回数据的SQL语句,通过链接字符串创建的Connection
        /// </summary>
        /// <param name="connectionString">数据库链接字符串</param>        
        /// <param name="cmdType">Command类型</param>
        /// <param name="cmdText">SQL脚本</param>
        /// <param name="commandParameters">SQL参数集合</param>
        /// <returns>返回影响的行数</returns>
        public static int ExecuteNonQuery(String connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {            SqlCommand cmd = new SqlCommand();            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }.................
}
代码比较长,希望不要晕,现在的问题是,当我当前数据库链接的的方式系统一切正常,但只要我用过一次ExecuteNonQuery(String connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters),就是通过其他途径 如:链接字符串、其他的SqlConnection,或者其他SqlConnection的SqlTransaction 创建的 SqlConnection,那么再用 当前数据库链接的时候,就会报错:InvalidOperationException: ConnectionString 属性尚未初始化,也就是说经过这样一个动作,SqlConnection的链接字符串被搞丢了,请分析一下,这个代码的漏洞在哪儿???

解决方案 »

  1.   

    最好用下conn.Open();和conn.Close();
      

  2.   

    ExecuteNonQuery(String connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)后
    要关闭连接
      

  3.   

    using (SqlConnection conn = new SqlConnection(connectionString))
    {}
    我这样用是不是 系统自动回收呢??
      

  4.   

    代码好多,暂时没有看出来,
    不过你的编码好像很随意,最起码数据库应该尽量晚开,尽量早关。
    连接字符串为什么不写在web.config里?
      

  5.   

    sorry 没有看到using (SqlConnection conn = SqlHelper.Connection)这句
      

  6.   

    我的代码是用在winform 的程序,我这样使用是为了访问多数据库,如果这样的话,我访问一下其他数据库,回到我的主数据库就报错了其实我有一个笨方法,就是if (connection != null && connection.State == ConnectionState.Closed)
                    {
                        //重新连接
                        connection.Open();
                    }改成 //重新创建
                        connection = SqlHelper.ConnectionDB();虽然可以解决问题,但会频繁的链接主数据库
      

  7.   

    string connstr = "server=192.168.0.1;User ID=sa;Password=;database=HrSysTool;Connection Reset=FALSE";
                System.Data.SqlClient.SqlConnection conn1 = null;
                using (conn1 = new System.Data.SqlClient.SqlConnection(connstr))
                {
                    conn1.Open();
                    Console.WriteLine(conn1.ConnectionString);
                }
                Console.WriteLine(conn1.ConnectionString);
                Console.ReadLine();
    因为sqlconnection关闭后其ConnectionString属性会被清空。
      

  8.   

    sqlconnection应该用完之后及时关闭,楼主这种共享sqlconnection的设计欠妥。
      

  9.   

    我个人认为,主数据库的链接应该共享,(我的程序是 winform 不是 webform),否则会频繁的联通和断开,毕竟核心业务在主数据库,而且应用相当频繁,而我在完成主业务的同时,需要更新其他几个数据库的数据(异地、远程),这样我采用重新加载 另一个 sqlconnection 来操作远程数据库,使用完毕后,我是关闭掉的,就是因为关闭了 远程链接,才造成 核心数据库链接也被关闭了,并且ConnectionString也丢了,导致 conn.open()时异常
      

  10.   

    http://noriko529784.blog.163.com/大量开源代码和资料,需要的在主页中注明电子邮箱
      

  11.   

    我这个程序里不涉及多线程,只是单线程,做成共享 只是为了减少 数据库的 通/断 次数,如果我不访问其他数据库,应该不会有什么问题,与webform的无状态链接不同,我可以一直保持这种链接,只是服务器会加重负担,但现在看来,只能小面积共享了,关闭其他数据库链接必然影响这个共享,看来只能 重新链接了