C# NullReferenceException随机发生

C# NullReferenceException随机发生,c#,asp.net,ms-access,C#,Asp.net,Ms Access,我目前正在使用c#编写一个用ASP.NET编写的web应用程序 我有一个OleDBDatareader读取存储在.mdb文件中的网页内容,同时,另一个阅读器正在查找动态菜单内容(相同的.mdb文件) 在浏览页面时,我随机得到一个NullReferenceEEException声明读卡器为空。这似乎发生在一个随机页面上,以及使用阅读器的一种方法上(不总是相同的方法) 以下是菜单代码: 这是页面代码: 提前谢谢 编辑1:存在异常@win.abbraccio-onlus.it的实时版本 编辑2:以下是

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

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

在浏览页面时,我随机得到一个
NullReferenceEEException
声明读卡器为空。这似乎发生在一个随机页面上,以及使用阅读器的一种方法上(不总是相同的方法)

以下是菜单代码:

这是页面代码:

提前谢谢

编辑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

问题出在
EseguiReader
函数中。将连接创建为专用变量。当您退出函数时-该变量超出范围。最终,垃圾收集器会将其收集起来,并关闭和处理您的连接,使读卡器成为孤儿。这是随机发生的,因为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);
使用后不要忘记关闭读卡器/连接


ms访问和并发不是很好的frien。只有一个建议:使用积极的缓存,尽可能避免影响数据库。一般来说是正确的,但MS Access更是如此。。。顺便说一句,如果您使用Access,您的数据库大小应该小于2GB(如果我没有弄错Access的大小限制的话),因此它可能完全适合Web服务器中的内存。您似乎在使用其他类来打开DBReader(称为数据库)。该类中很可能发生异常,导致返回空值。你有这个类的源代码吗?你能发布
db.EseguiReader()
方法的代码吗?具体来说,它是如何创建和打开连接的,以及它是如何创建读卡器的。读卡器真的是空的,还是通过读卡器[“column”]读取的某些列的内容?只需对列值调用ToString,而不检查它们是否为null。