NullReferenceException随机发生

时间:2013-10-15 13:00:07

标签: c# asp.net ms-access

我目前正在使用c#编写用ASP.NET编写的Web应用程序。

我有一个OleDBDatareader读取存储在.mdb文件中的网页内容,同时另一位读者正在寻找动态菜单内容(相同的.mdb文件)。

在浏览页面时,我随机获得NullReferenceEexception,表明读者为空。这似乎发生在一个随机页面上,以及使用读者的一种方法(并不总是相同的)。

以下是菜单代码:http://pastebin.com/TCtj3vxj

这是页面代码:http://pastebin.com/gYDHkTKv

提前致谢。

编辑1:有一个例外的实时版本@ win.abbraccio-onlus.it

编辑2:这是db.EseguiReader代码:

public OleDbDataReader EseguiReader(string _query)
        {
            OleDbConnection conn = this.getConnessione();

                conn.Open();
                OleDbCommand cmd = new OleDbCommand();
                cmd.CommandText = _query;
                cmd.Connection = conn;
                return cmd.ExecuteReader();
       }

编辑3:堆栈跟踪:

NullReferenceException: Object reference not set to an instance of an object.]
   WebApplication3.classi.MenuuService.caricaFigli(String categoria) +322
   WebApplication3.Site1.Page_Load(Object sender, EventArgs e) +192
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
   System.Web.UI.Control.OnLoad(EventArgs e) +92
   System.Web.UI.Control.LoadRecursive() +54
   System.Web.UI.Control.LoadRecursive() +145
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

1 个答案:

答案 0 :(得分:2)

问题出在EseguiReader函数中。您将连接创建为私有变量。退出函数时 - 该变量超出范围。最终垃圾收集器收集它并关闭并处理您的连接,使Reader孤立。这是随机发生的,因为当GC启动时它是不可预测的。

一种解决方案是在函数外部创建连接并将其作为参数之一传递,因此它不会超出范围。 E.g。

public OleDbDataReader EseguiReader(string _query, OleDbConnection conn)
{
    conn.Open();
    OleDbCommand cmd = new OleDbCommand();
    cmd.CommandText = _query;
    cmd.Connection = conn;
    return cmd.ExecuteReader();
}

并称之为

OleDbConnection conn = this.getConnessione();
OleDbDataReader reader = db.EseguiReader(querypagina, conn);

使用后请不要忘记关闭阅读器/连接

Reference