我目前正在使用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
答案 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);
使用后请不要忘记关闭阅读器/连接