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

|
    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()); 
     }

}
我不明白为什么我得到它。我要做的就是让最后一个发布线程的人。我看着调试,一切似乎都很好。我也在Visual Studio 2010中查看了sql服务器。.有数据,但不知何故没有读取,并引发了异常... :(     
已邀请:
        您必须遍历您的阅读器:
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()); 
}
if(dr.Read())
(如果您只有一个结果) 和 您应该始终在阅读器周围使用以下用途:
using(dr)
{
    while(dr.Read())
    {
    }
}
并且在调用ToString()之前应该做一些空检查。
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\";
    
        您应该在访问值之前检查dr.Read():
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());
}
    

要回复问题请先登录注册