当前位置:编程学习 > C#/ASP.NET >>

asp.net 经常无法访问数据库!



当前网站使用的DBHelper.cs 


using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
/*********************************
 * 类名:DBHelper
 * 功能描述:提供数据访问基础操作
 * ******************************/
namespace MyVodDAL
{
    public class DBHelper
    {

       private static string connectionString = ConfigurationManager.ConnectionStrings["MyVodConnectionString"].ConnectionString;


       private static SqlConnection con = new SqlConnection(connectionString);
       private static SqlConnection con1 = new SqlConnection(connectionString);

        /// <summary>
        /// 查询表信息
        /// </summary>
        /// <param name="sql">查询语句</param>
        /// <returns>DataTable表</returns>
        public static DataTable GetData(string sql)
        {

            //判断如果第一个SqlConnection正在使用中则使用另外一个
            if (con.State == ConnectionState.Open)
            {
                SqlDataAdapter sda = new SqlDataAdapter(sql, con1);
                DataTable dt = new DataTable();
                try
                {
                    sda.Fill(dt);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    sda.Dispose();
                    con1.Close();
                }
                return dt;
            }
            else
            {
                SqlDataAdapter sda = new SqlDataAdapter(sql, con);
                DataTable dt = new DataTable();
                try
                {
                    sda.Fill(dt);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    sda.Dispose();
                    con.Close();
                }
                return dt;
            }
        }

        /// <summary>
        /// 执行无参SQL语句,返回影响行数
        /// </summary>
        /// <param name="sql">查询语句</param>
        /// <returns>返回影响行数</returns>
        public static int ExecuteNonQuery(string sql)
        {
            int result = 0;
            SqlCommand com = new SqlCommand(sql, con);
            try
            {
                con.Open();
                result = com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                com.Clone();
                con.Close();
            }
            return result;
        }
        /// <summary>
        /// 执行无参数SQL语句,返回第一行的第一列
        /// </summary>
        /// <param name="sql">查询语句</param>
        /// <returns>首行首</returns>
        public static int ExecuteScalar(string sql)
        {
            int result = 0;
            SqlCommand com = new SqlCommand(sql, con);
            try
            {
                con.Open();
                result = int.Parse(com.ExecuteScalar().ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                com.Clone();
                con.Close();
            }
            return result;
        }
    }
}


错误页面!!!


目前解决办法:
  IIS管理器  对应“应用程序池”右键回收

网站刷新就正常了!!!!!!!!!!


请高手帮忙看看什么原因啊~~~~~~~
--------------------编程问答-------------------- 个人认为最好是方法内实例化SqlConnection对象,也就是在每次需要连接数据库的时候实例化SqlConnection对象,用完之后马上释放资源,还有,你的GetData方法判断的con,而你的方法用的是con1的连接对象,不太清楚你这样写有什么特别的用意。 --------------------编程问答--------------------
引用 1 楼 wlkjhxd 的回复:
个人认为最好是方法内实例化SqlConnection对象,也就是在每次需要连接数据库的时候实例化SqlConnection对象,用完之后马上释放资源,还有,你的GetData方法判断的con,而你的方法用的是con1的连接对象,不太清楚你这样写有什么特别的用意。



用法是先判断 con 是否已经打开~~如果打开着那我用另外一个con1做连接
--------------------编程问答-------------------- 你这写比较有问题,特别是比较多用户诘问的时候,很可能会打开大量的连接,而导致达到数据库连接上限而拒绝连接,这就是为什么你对应“应用程序池”右键回收之后又能访问的原因。 --------------------编程问答--------------------
引用 3 楼 wlkjhxd 的回复:
你这写比较有问题,特别是比较多用户诘问的时候,很可能会打开大量的连接,而导致达到数据库连接上限而拒绝连接,这就是为什么你对应“应用程序池”右键回收之后又能访问的原因。


实例化SqlConnection对象

用好就Close这个会达到数据库连接上线吗??
如果不会出现这样的 错误的话我尝试下~~~   --------------------编程问答-------------------- 既然这样写有问题就换个写法吧 写法多的很
--------------------编程问答--------------------

private static SqlConnection con = new SqlConnection(connectionString);
private static SqlConnection con1 = new SqlConnection(connectionString);

静态的Connection对象,非常有问题,你想想多人差不多同时访问的时候,会出现
A页面要访问数据库,找开了连接,它做的事情比较多,比如要3秒完成操作,这时,
B页面差不多同时被请求,它做的事情比较少,只要1秒,它做完事情后关闭了连接,
这时A会怎么样呢? --------------------编程问答--------------------

private static SqlConnection con = new SqlConnection(connectionString);
private static SqlConnection con1 = new SqlConnection(connectionString);

静态的Connection对象,非常有问题,你想想多人差不多同时访问的时候,会出现
A页面要访问数据库,找开了连接,它做的事情比较多,比如要3秒完成操作,这时,
B页面差不多同时被请求,它做的事情比较少,只要1秒,它做完事情后关闭了连接,
这时A会怎么样呢? --------------------编程问答-------------------- 进来学习下! --------------------编程问答-------------------- 顶6楼 --------------------编程问答-------------------- 用lingq很方便的也好用并且他还能检查出数据库的一些错误
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,