2011-06-12 56 views
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()); 
    } 

} 

我不明白我爲什麼得到它。我所要做的就是讓最後一個發佈帖子的人..我看着調試,而事情看起來很好。我也看了視覺工作室2010年的SQL服務器..有數據,,但不知何故它沒有被讀取和拋出異常...... :(InvalidOperationException:無數據存在時無效嘗試讀取。 (SQL)

回答

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())如果你只有一個結果

而且 你笑你總是圍繞着你的閱讀器用一個:

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"; 
+0

你是什麼意思逐字... ..爲什麼你使用var查詢,而不是stringbuilder? – Matrix001 2011-06-12 17:08:29

+0

var query是一個字符串。看看這裏的逐字記號的更多信息:http://en.csharp-online.net/CSharp_FAQ:_What_is_a_verbatim_string_literal – 2011-06-12 17:12:23

+0

我得到的屬性中的空值..如果數據庫中沒有任何內容..我爲ThreadParagraph得到null,休息... – Matrix001 2011-06-12 17:17:54

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

另外,你應該檢查是否有任何結果:如果(dr.HasRows){... – Peter 2011-06-12 17:05:10

+0

彼得,我更喜歡使用dr.Read ..但是我確實知道我有數據庫中的數據。因爲我進入它,並看到 – Matrix001 2011-06-12 17:07:42

相關問題