之前发过:http://topic.csdn.net/u/20101022/16/d4596a4b-07fc-45f6-a2f2-fbfee071c981.html?32438很多朋友也给了建议,但是我改来改去,问题依然存在,就是一会正常,一会不正常。求个位帮帮忙啊!!!!!问题:“/zhxy”应用程序中的服务器错误。
--------------------------------------------------------------------------------ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。
OledbHelper 代码:
public class OleDbHelper
    {
        static OleDbConnection conn = null;
        static OleDbCommand cmd = null;
        static string appPath = System.Web.HttpContext.Current.Request.ApplicationPath;
        static string connStr = "provider=microsoft.jet.oledb.4.0;data source="+System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb")+"";
        
        public OleDbConnection OpenConnection()
        {
            try
            {
                //connStr = ConfigurationManager.ConnectionStrings["DBS"].ToString() + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb");
                conn = new OleDbConnection(connStr);
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
            }
            catch { }
            return conn;
        }        public  void CloseConnection()
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }        public void CloseConnection(OleDbConnection connection)
        {
            if (connection.State == ConnectionState.Open)
            {
                connection.Close();
            }
        }        public object DB_ExecuteScalar(string sqlStr)
        {
            OleDbConnection conn = OpenConnection();
            cmd = new OleDbCommand(sqlStr, conn);
            return cmd.ExecuteScalar();
        }        public OleDbDataReader ExecuteOdr(string sqlStr, OleDbConnection conn)
        {
            cmd = new OleDbCommand(sqlStr, conn);
            OleDbDataReader odr = cmd.ExecuteReader();
            return odr;
        }        public int DB_ExecuuteNonQuery(string sqlStr)
        {
            OleDbConnection conn = OpenConnection();
            cmd = new OleDbCommand(sqlStr, conn);
            int result = cmd.ExecuteNonQuery();
            CloseConnection(conn);
            return result;
        }        public DataTable DB_Fill(string sqlStr)
        {
            OleDbConnection conn = OpenConnection();
            DataTable dt = new DataTable();
            OleDbDataAdapter oda = new OleDbDataAdapter(sqlStr, conn);
            oda.Fill(dt);
            return dt;
        }
    }引用 ExecuteOdr 方法的的代码:
public MODEL.CompanyInfo GetModel(int id)
        {
            MODEL.CompanyInfo model = new MODEL.CompanyInfo();
            OleDbConnection conn = helper.OpenConnection();
            sqlStr = new StringBuilder();
            sqlStr.Append("select * from CompanyInfo ");
            sqlStr.Append("where ID=" + id + "");
            OleDbDataReader odr = helper.ExecuteOdr(sqlStr.ToString (), conn);
            if (odr.Read() == true)
            {
                model.ID = (int)odr[0];
                model.InfoTitle = odr[1].ToString();
                model.InfoContent = odr[2].ToString();
            }
            odr.Close();
            helper.CloseConnection(conn);
            return model;
        }问题到底出在哪?求个位详加指点下,小弟新人,先致敬了!!!

解决方案 »

  1.   

    感觉应该是Access的问题,Access数据库连接数有限制,超出了最大连接数就会报错,改用sql server就好了
      

  2.   

    你怎么能用静态的static OleDbConnection conn = null;
    把这个静态去了,asp.net是多线程,这样很容易出问题。连接有连接池的,所以你不用用静态来提升性能。
      

  3.   

    access并发有限制
    写时候可能把文件锁死了,另一个进程读就会失败
      

  4.   


    public OleDbConnection OpenConnection()
            {
                
                    //connStr = ConfigurationManager.ConnectionStrings["DBS"].ToString() + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb");
                    OleDbConnection conn = new OleDbConnection(connStr);
                    
                        conn.Open();
                return conn;
            }
    返回实例的connection对象,这个对象是从连接池中得到的,再就是把try catch去掉,这么底层的代码,不应该把异常吃掉,那是界面层需要管的事
      

  5.   

    OleDbConnection conn = helper.OpenConnection();//这里
    你的方法是
    public OleDbConnection OpenConnection()
            {
                try
                {
                    //connStr = ConfigurationManager.ConnectionStrings["DBS"].ToString() + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb");
                    conn = new OleDbConnection(connStr);
                    if (conn.State == ConnectionState.Closed)
                    {
                        conn.Open();
                    }
                }
                catch { }
                return conn;
            }你重载一个带参数的方法,参数就是connection对象,试下
      

  6.   


    去掉 静态后,提示 
    未将对象引用设置到对象的实例。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
      

  7.   

    我想楼主是不是执行100次就报错了~~~~~~
    是conn没有关闭应该是   它每次关闭都是放到那什么池中  那里边只能放100份  
    如果是就要好好检查自己的代码……
      

  8.   

    楼上 星爷 头像:我检查过,每个 方法 我都 关闭了 conn的。。
      

  9.   

    你能说一下你的方法都是怎么调用的吗?是model.dal,bll.分开的然后调用吗?我也是这个问题,已解决了
      

  10.   

      OleDbDataReader odr = cmd.ExecuteReader();
      改成 cmd.ExecuteReader(CommandBehavior.CloseConnection); 试试
      

  11.   

    。支掉静态后,就把这个删了吧,不要用它了。改成静态类,静态方法,方便调用,
    public static class OleDbHelper
        {
            static string appPath = System.Web.HttpContext.Current.Request.ApplicationPath;
            static string connStr = "provider=microsoft.jet.oledb.4.0;data source=" + System.Web.HttpContext.Current.Server.MapPath(appPath + "/App_Data/ZHXYDB.mdb") + "";        public static OleDbConnection OpenConnection()
            {
                OleDbConnection conn = new OleDbConnection(connStr);
                conn.Open();
                return conn;
            }        public static object DB_ExecuteScalar(string sqlStr)
            {
                using (OleDbConnection conn = OpenConnection())
                {
                    OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
                    return cmd.ExecuteScalar();
                }//不要手动关闭了,用using来关
            }        public static OleDbDataReader ExecuteOdr(string sqlStr, OleDbConnection conn)
            {
                OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
                OleDbDataReader odr = cmd.ExecuteReader();
                return odr;
            }        public static int DB_ExecuuteNonQuery(string sqlStr)
            {
                using (OleDbConnection conn = OpenConnection())
                {
                    OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
                    int result = cmd.ExecuteNonQuery();
                    return result;
                }
            }        public static DataTable DB_Fill(string sqlStr)
            {
                using (OleDbConnection conn = OpenConnection())
                {
                    DataTable dt = new DataTable();
                    OleDbDataAdapter oda = new OleDbDataAdapter(sqlStr, conn);
                    oda.Fill(dt);
                    return dt;
                }
            }
        }
      

  12.   


    public MODEL.CompanyInfo GetModel(int id)
            {
                MODEL.CompanyInfo model = new MODEL.CompanyInfo();
                OleDbConnection conn = OleDbHelper.OpenConnection();
                sqlStr = new StringBuilder();
                sqlStr.Append("select * from CompanyInfo ");
                sqlStr.Append("where ID=" + id + "");
                OleDbDataReader odr = OleDbHelper.ExecuteOdr(sqlStr.ToString (), conn);
                if (odr.Read() == true)
                {
                    model.ID = (int)odr[0];
                    model.InfoTitle = odr[1].ToString();
                    model.InfoContent = odr[2].ToString();
                }
                odr.Close();
                conn.Close();
                return model;
            }
      

  13.   

    另外还可以改进一下Helper的类,ExecuteOdr改成如下这样。
    public static OleDbDataReader ExecuteOdr(string sqlStr)
            {
                OleDbCommand cmd = new OleDbCommand(sqlStr, OpenConnection());
                OleDbDataReader odr = cmd.ExecuteReader(CommandBehavior.CloseConnection); //在关闭reader的同时关闭连接
                return odr;
            }
    这样调用就方便了
    public MODEL.CompanyInfo GetModel(int id)
            {
                MODEL.CompanyInfo model = new MODEL.CompanyInfo();
                sqlStr = new StringBuilder();
                sqlStr.Append("select * from CompanyInfo ");
                sqlStr.Append("where ID=" + id + "");
                OleDbDataReader odr = OleDbHelper.ExecuteOdr(sqlStr.ToString ());
                if (odr.Read() == true)
                {
                    model.ID = (int)odr[0];
                    model.InfoTitle = odr[1].ToString();
                    model.InfoContent = odr[2].ToString();
                }
                odr.Close(); //关闭它的情况下,会自动关闭连接的.
                return model;
            }
      

  14.   

    这样一来,我的DAL层里的所有的方法 都要 修改了...
      

  15.   

    我要哭了。 我全部 按照 你的方法 改了 。但是 又出现了下面的问题唉。。学点东西 怎么就这么难呢。。未指定的错误 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 未指定的错误源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  堆栈跟踪: 
    [OleDbException (0x80004005): 未指定的错误]
       System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) +1054817
       System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) +53
       System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) +27
       System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +47
       System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +105
       System.Data.OleDb.OleDbConnection.Open() +37
       DAL.OleDbHelper.OpenConnection() in E:\学友资料\学友网站 备份\ZH-XY\DAL\OleDbHelper.cs:19
       DAL.CompanyInfo.GetModel(Int32 id) in E:\学友资料\学友网站 备份\ZH-XY\DAL\CompanyInfo.cs:40
       BLL.CompanyInfo.GetModel(Int32 id) in E:\学友资料\学友网站 备份\ZH-XY\BLL\CompanyInfo.cs:33
       company.Page_Load(Object sender, EventArgs e) +113
       System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
       System.Web.UI.Control.OnLoad(EventArgs e) +99
       System.Web.UI.Control.LoadRecursive() +47
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061
      

  16.   

    BLL 的方法都不要静态的!
      

  17.   


    我 bll里面 没静态方法啊。。
      

  18.   

           OleDbDataReader odr = OleDbHelper.ExecuteOdr(sqlStr.ToString (), conn);
                if (odr.Read() == true)
                {
                    model.ID = (int)odr[0];
                    model.InfoTitle = odr[1].ToString();
                    model.InfoContent = odr[2].ToString();
                }
    //为什么你不释放资源
                  odr.Dispose();//释放资源
                odr.Close();            conn.Close();
                return model;
      

  19.   

    这看来是另外一个问题了,
    参考下这个帖子
    http://topic.csdn.net/u/20070828/17/7cceb47c-f0c2-46cb-9a9b-797d7193c661.html
    http://bbs.pageadmin.net/showtopic.aspx?topicid=37&forumpage=1&onlyauthor=1
      

  20.   

    还有这个
    http://support.microsoft.com/kb/825738
      

  21.   

    http://msmvps.com/blogs/rakeshrajan/archive/2005/07/04/56461.aspx
    还是看这个吧,大概是说因为文件夹操作权限的问题.