0
    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サーバーも調べました.データがありますが、どういうわけか読み取られず、例外がスローされます... :(

4

2 に答える 2

2

値にアクセスする前に、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());
}
于 2011-06-12T17:02:02.383 に答える
0

リーダーをループする必要があります。

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())、結果が 1 つしかない場合

そして、常に Reader を using で囲む必要があります。

using(dr)
{
    while(dr.Read())
    {
    }
}

また、ToString(); を呼び出す前に、null チェックを行う必要があります。

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";
于 2011-06-12T17:02:05.543 に答える