C# InvalidOperationException:当不存在数据时,读取尝试无效。(SQL)

C# InvalidOperationException:当不存在数据时,读取尝试无效。(SQL),c#,sql,invalidoperationexception,C#,Sql,Invalidoperationexception,我不明白为什么我会得到它。我想做的就是找到最后一个发帖子的人。。我看了一下调试,事情似乎很好。我还研究了VisualStudio2010中的sql server。。有数据,但不知何故,它没有被读取,并引发异常…:(在访问值之前,您应该检查dr.Read(): void ExecuteContent() { StringBuilder sb = new StringBuilder(); sb.Append("SELECT TOP 1 @UsersID,u.Avatar,t.

我不明白为什么我会得到它。我想做的就是找到最后一个发帖子的人。。我看了一下调试,事情似乎很好。我还研究了VisualStudio2010中的sql server。。有数据,但不知何故,它没有被读取,并引发异常…:(

在访问值之前,您应该检查dr.Read():

    void ExecuteContent()
{
    StringBuilder sb = new StringBuilder();
    sb.Append("SELECT TOP 1 @UsersID,u.Avatar,t.Date, u.Name, t.ThreadTitle, t.ThreadParagraph");
     sb.Append(" FROM Users as u");
     sb.Append(" INNER JOIN Threads as t ON u.UsersID = t.UsersID");
     sb.Append(" Where @UsersID=t.UsersID");
     sb.Append(" ORDER BY t.Date DESC");


     using (SqlConnection conn = new SqlConnection(AnswerQuestion.connectionString))
     {
         conn.Open();
         SqlCommand sqlComm = new SqlCommand(sb.ToString(), conn);
        MembershipUser CurrentUser = Membership.GetUser();    
         Guid i = (Guid)CurrentUser.ProviderUserKey;
         sqlComm.Parameters.Add("@UsersID", SqlDbType.UniqueIdentifier).Value = i;
         SqlDataReader dr = sqlComm.ExecuteReader();

         UserName = dr["Name"].ToString();//The exception is thrown here
         Image = (Image) dr["Avatar"];
         ThreadTitle = dr["ThreadTitle"].ToString();
         ThreadParagraph = dr["ThreadParagraph"].ToString();
         Time = (DateTime)AllQuestionsPresented.TryParse(dr["Date"].ToString()); 
     }

}

您必须通过您的阅读器循环:

if(dr.Read())
{
    UserName = dr["Name"].ToString();//The exception is thrown here
    Image = (Image) dr["Avatar"];
    ThreadTitle = dr["ThreadTitle"].ToString();
    ThreadParagraph = dr["ThreadParagraph"].ToString();
    Time = (DateTime)AllQuestionsPresented.TryParse(dr["Date"].ToString());
}
或者
if(dr.Read())
如果只有一个结果

及 您应始终使用以下工具围绕您的读者:

while(dr.Read())
{
    serName = dr["Name"].ToString();//The exception is thrown here
         Image = (Image) dr["Avatar"];
         ThreadTitle = dr["ThreadTitle"].ToString();
         ThreadParagraph = dr["ThreadParagraph"].ToString();
         Time = (DateTime)AllQuestionsPresented.TryParse(dr["Date"].ToString()); 
}
在调用ToString()之前,应该进行一些空检查

这里有一个用代码编写查询的小技巧,使用逐字记录:

ThreadParagraph = dr["ThreadParagraph"] == null ? "" : dr["ThreadParagraph"].ToString();

此外,您应该检查是否有任何结果:if(dr.HasRows){…Peter,我更喜欢使用dr.Read..但我知道我在数据库中有数据。因为我输入了它,看到了你所说的逐字翻译是什么意思..为什么你要使用var查询而不是stringbuilder?var查询是一个字符串。在这里查看有关逐字翻译符号的更多信息:我在属性中得到null..好像数据库中没有任何内容..我为ThreadPara得到nullgraph和其他…我看到了问题所在…出于某种原因,我在一个insert语句中遇到了一个问题,但我没有在这里出现。它起作用了…但现在它停止了作用..我需要检查原因:(…感谢帮助…我做了一个DBnull.Value.Equals(dr[“Image”])和更多的空检查
ThreadParagraph = dr["ThreadParagraph"] == null ? "" : dr["ThreadParagraph"].ToString();
var query = @"SELECT TOP 1 @UsersID,u.Avatar,t.Date, u.Name, t.ThreadTitle, t.ThreadParagraph 
    FROM Users as u 
    INNER JOIN Threads as t ON u.UsersID = t.UsersID 
    Where @UsersID=t.UsersID ORDER BY t.Date DESC";