0

私は現在、c# を使用して ASP.NET で記述された Web アプリケーションに取り組んでいます。

OleDBDatareaderファイルに保存されているWebページのコンテンツを読んで.mdbいると同時に、別のリーダーが動的メニューコンテンツ(同じ.mdbファイル)を探しています。

NullReferenceEexceptionページを移動すると、リーダーが null であるというメッセージがランダムに表示されます。これは、ランダムなページと、リーダーを使用するメソッドの 1 つ (常に同じとは限りません) で発生するようです。

メニューコードは次のとおりです。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機能にあります。プライベート変数として接続を作成します。関数を終了すると、その変数はスコープ外になります。最終的にガベージ コレクターがそれを収集し、接続を閉じて破棄し、リーダーを孤立させます。これは、GC が開始されると予測できないため、ランダムに発生します。

解決策の 1 つは、関数の外部で接続を作成し、それをパラメーターの 1 つとして渡すことです。これにより、範囲外にはなりません。例えば

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 に答える