InvalidOperationException: недопустимая попытка чтения, когда данные отсутствуют.(SQL) - PullRequest
0 голосов
/ 12 июня 2011
    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()); 
     }

}

Я не понимаю, почему я это понимаю. Все, что я пытаюсь сделать, - это получить последнего человека, который разместил ветку .. Я посмотрел на отладку, и все выглядит нормально. Я также посмотрел на сервер SQL в Visual Studio 2010 .. Есть данные ,, но как-то не читается и выдается исключение ...: (

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Вы должны проверить 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());
}
0 голосов
/ 12 июня 2011

Вы должны выполнить цикл через ваш ридер:

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";
...