2013-10-15 4 views
0

В настоящее время я работаю над веб-приложением, написанным на ASP.NET с использованием C#.NullReferenceException случайное случайное

У меня есть OleDBDatareader чтение содержимого веб-страницы, хранящегося в файле .mdb, и в то же время другой читатель ищет содержимое динамического меню (то же самое .mdb файл).

При навигации по страницам я случайно получаю NullReferenceEexception, в котором указано, что читатель равен нулю. Это происходит на случайной странице, и по одному из методов, использующих читатели (не всегда одно и то же).

Вот код меню: http://pastebin.com/TCtj3vxj

А вот код страницы: http://pastebin.com/gYDHkTKv

Спасибо заранее.

Edit 1: Существует живая версия исключение @ win.abbraccio-onlus.it

Edit 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(); 
     } 

Edit 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

мса доступа и согласования не является хорошим Frien. –

+0

Только одно предложение: используйте агрессивное кеширование и избегайте попадания в БД как можно больше. Правда, в общем, но тем более с MS Access ... BTW, если вы используете Access, ваша БД должна быть размером менее 2 ГБ (если я не ошибаюсь в ограничениях доступа), поэтому он, вероятно, мог бы соответствовать полностью в памяти вашего веб-сервера –

+1

Вы, кажется, используете какой-либо другой класс для открытия DBReader (называемой базы данных). Вероятно, исключение происходит в этом классе, что приводит к возврату нулевого значения. У вас есть источник для этого класса? –

ответ

2

Проблема в 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); 

Не забудьте закрыть читатель/соединение после использования

Reference

Смежные вопросы