位置0查询没有行

时间:2014-09-04 10:38:05

标签: c# sql asp.net

我是C#和.NET的新手,我正在努力解决一些抛出错误的代码,它抛出的错误是:

There is no row at position 0.

这是我得到的代码,据我所知,如果sql重写0行应该显示404,但是当时我收到了堆栈错误。

这是堆栈错误:

[IndexOutOfRangeException: There is no row at position 0.]
System.Data.RBTree`1.GetNodeByIndex(Int32 userIndex) +2409382
System.Data.DataRowCollection.get_Item(Int32 index) +20
Targetting.ArticlePage.Page_Load(Object sender, EventArgs e) in C:\SRC\Site1\Web\Article\Trunk\Article.aspx.cs:78
CommonBasePageClass.BaseWebPage.OnLoad(EventArgs e) +50
System.Web.UI.Control.LoadRecursive() +71
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3178

以下是我认为抛出错误的代码:

//If the article is Archived or Unknown or has expired then all users should be shown an "unavailable" message instead of the content
if (dt.Rows[0]["pagestatusid"].ToString() == "3" || dt.Rows[0]["pagestatusid"].ToString() == "0" || (dt.Rows[0]["expirydate"] != DBNull.Value && DateTime.Parse(dt.Rows[0]["expirydate"].ToString()) < DateTime.Now))
{
    pnlDraftWarning.Visible = false;
    pnlContentNotAvailable.Visible = true;
    pnlMainContent.Visible = false;

    Response.StatusCode = 404;
    return;
}

3 个答案:

答案 0 :(得分:4)

错误是第零行没有数据 - 表dt为空。

代码期望至少有一行

if (dt.Rows[0]["pagestatusid"].ToString() == "3" || dt.Rows[0]["pagestatusid"].ToString() == "0" || (dt.Rows[0]["expirydate"] != DBNull.Value && DateTime.Parse(dt.Rows[0]["expirydate"].ToString()) < DateTime.Now))
{
}

您可以通过添加保护条件来检查是否有数据来解决此问题。

if (dt == null ||
    dt.Rows.Count < 1 ||
    dt.Rows[0]["pagestatusid"].ToString() == "3" ||
    dt.Rows[0]["pagestatusid"].ToString() == "0" ||
    (dt.Rows[0]["expirydate"] != DBNull.Value &&
     DateTime.Parse(dt.Rows[0]["expirydate"].ToString()) < DateTime.Now))
{
  // other code
}

或确定在您期待某些数据时可能没有数据的原因。

答案 1 :(得分:0)

检查是否有任何行:

if (
       dt.Rows.Count()>0 && 
       (
           dt.Rows[0]["pagestatusid"].ToString() == "3" || 
           dt.Rows[0]["pagestatusid"].ToString() == "0" || 
           (
               dt.Rows[0]["expirydate"] != DBNull.Value && 
               DateTime.Parse(dt.Rows[0]["expirydate"].ToString()) < DateTime.Now
           )
       )
   )
{
    pnlDraftWarning.Visible = false;
    pnlContentNotAvailable.Visible = true;
    pnlMainContent.Visible = false;

    Response.StatusCode = 404;
    return;
}

答案 2 :(得分:0)

你应该使用

if(dt.Rows.Count > 0)

if(dt == null)