0

私は現在、ソフトウェア会社のWebサイトで作業しています。ページが読み込まれるとすぐに実行され(Page_OnLoad、マスターページコードファイル内)、独自のクラスの新しいインスタンスを作成し、そこから関数を実行するメカニズムがあります。何週間もすべてが順調に進んでおり、現在の原因にまったく影響を与えないまったく異なるページ/領域でWebサイトに取り組んでいました。

そのため、次のことが起こりました。asp.net開発サーバーでWebサイトを試しました。すべてが正常で、正しく機能していました。そこで、IISサーバーにアップロードしました。Webサイトにアクセスしました:すべてがエラーなしで実行されています。20分ほど後、ページを更新しました:NullReferenceException、どこからともなく。そして今、私はそれを取り除くことができません。

これはスタックからのメッセージです:

   [NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.]
   EITS.WWW.Helper.cUserLog.TrackUserLog(HttpRequest request) in     C:\EIT\Projekte\eits.ch\www.eits.ch\EITSWeb\www.eits.ch\Includes\cUserLog.cs:72
   EITS.WWW.IndexMaster.Page_Load(Object sender, EventArgs e) in C:\EIT\Projekte\eits.ch\www.eits.ch\EITSWeb\www.eits.ch\Index.Master.cs:22
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +24
   System.Web.UI.Control.LoadRecursive() +70
   System.Web.UI.Control.LoadRecursive() +189
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3063

マスターページコードファイル:

http://codetidy.com/3244/

呼び出されるクラス:

http://codetidy.com/3245/
4

1 に答える 1

1

例外をスローしているコードのセクションは次のとおりです。

String vSQL = "SELECT * FROM eits_visitor WHERE ip = '" + oUser.usrIP + "'";
DataTable dtCurrent = SQLCon.GetDataTableFromSQL(vSQL, oHelper.cfgConnection);

if (dtCurrent != null && dtCurrent.Rows.Count > 0) {
    // Check if IP is registered today
    vSQL = "SELECT TOP(1)* FROM eits_log WHERE visitor_ip = '" + oUser.usrIP + "' ORDER BY date DESC;";
    dtCurrent = SQLCon.GetDataTableFromSQL(vSQL, oHelper.cfgConnection);

    // Next line is where the exception is thrown:
    if (SQLCon.DateFromString(dtCurrent.Rows[0]["date"].ToString()).DayOfYear != DateTime.Now.DayOfYear) {
        // do stuff
    }
}

問題は、dtCurrent.Rows[0] が存在することを確認していないこの 2 番目のクエリにあります。

最初のクエリでは、何かを行う前に dtCurrent.Rows.Count > 0 であることを確認しています。最初のクエリが結果を返したので、2 番目のクエリも結果を返すと仮定しているように見えますが、これは例外がスローされている場所であるため、その仮定を再考する必要があるかもしれません。

あなたのコメントは、2番目のクエリが「IPが今日登録されているかどうかを確認する」ことを目的としていると述べていますが、実際にはレコードが存在するかどうかを確認していません-レコードがそこにあると仮定してそれを使用しているだけで、コードが作成されますそのようなレコードがない場合は失敗します。

IPが今日登録されていない場合、記録は残っていますか? そうでない場合は、そこに問題があります。

このような問題に対する私の最初の対応は、チェックを追加して、私の仮定が正しいことを完全に確認することです。

if (dtCurrent.Rows.Count == 0)
    throw new Exception("The unthinkable happened - our assumption was wrong!");

// Next line is where the exception was being thrown before.
// Do we still get this far now?
if (SQLCon.DateFromString(dtCurrent.Rows[0]["date"].ToString()).DayOfYear != DateTime.Now.DayOfYear) {
    // do stuff
}
于 2012-08-06T13:38:02.900 に答える