0

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

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

浏览页面时,我随机收到一条NullReferenceEexception说明 reader 为空。这似乎发生在随机页面上,并且发生在使用阅读器的一种方法(并不总是相同)上。

这是菜单代码: 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
4

1 回答 1

2

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

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

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);

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

参考

于 2013-10-15T14:04:26.300 回答