0

我目前在一家软件公司的网站上工作。我有一种机制,在页面加载后立即运行(在 Page_OnLoad,Masterpage 代码文件中),创建一个自己的类的新实例并从那里运行一个函数。几周以来一切都运行良好,我在网站上工作的完全不同的页面/区域不会以任何方式影响我目前的事业。

所以发生了以下事情:我在 asp.net 开发服务器上尝试了该网站:一切都很好并且工作正常。所以我将它上传到我的 IIS 服务器。访问网站:一切仍在运行,没有错误。大约 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] 是否存在。

在第一个查询中,您正在做正确的事情 - 在做任何事情之前检查 dtCurrent.Rows.Count > 0。然后您似乎只是假设因为第一个查询返回了结果,所以第二个查询也将返回,但是由于这是引发异常的地方,您可能需要重新考虑该假设。

您的评论说第二个查询旨在“检查[ing]如果今天注册了 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 回答