2013-10-15 94 views
0

我目前正在使用c#編寫一個使用ASP.NET編寫的Web應用程序。NullReferenceException隨機發生

我有一個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 
+4

MS-訪問和同意後,關閉您的閱讀器/連接不好frien。 –

+0

只有一個建議:使用積極的緩存並儘可能避免擊中數據庫。一般情況下是這樣,但MS Access的情況更是如此......順便說一句,如果您使用Access,您的數據庫的大小應該小於2GB(如果我沒有誤解Access的大小限制),那麼它可能適合完全在您的網絡服務器的內存中 –

+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