2010-05-10 158 views
0
... 
    ... 
    ... 

      try 
      { 
       string Tags_collect; 

       SqlDataReader Data1 = cmd.ExecuteReader(); 
       Data1.Read(); 
       lbl_q_title.Text = Data1["subject"].ToString(); 

       Data1.NextResult(); 


       while (Data1.Read()) 
       { 
        Tags_collect = Data1.GetString(0); 
        Tags_collect= Tags_collect+ Tags_collect; 
       } 

       lbl_tags.Text = Tags_collect; 
    ..... 
    .... 

    .... 

不知道爲什麼我得到這個錯誤 我錯過了什麼?使用未分配的本地變量

+0

Tags_collect是未分配的局部變量。執行可能永遠不會進入while塊。 – flq 2010-05-10 19:59:41

+0

如何告訴我們編譯器在哪裏具體抱怨? – Joe 2010-05-10 20:00:44

回答

7

您第一次分配到Tags_collect位於while (Data1.Read())循環內,該循環不保證永遠執行。

string Tags_collect = string.Empty; 

更重要的是,使用StringBuilder,而不是依靠反覆級聯:

StringBuilder tags = new StringBuilder(); 
// ... 
while (Data1.Read()) 
{ 
    string tag = Data1.GetString(0); 
    sb.Append(tag); 
    sb.Append(","); // Separator 
} 
lbl_tags.Text = tags.ToString(); 

在循環連接字符串本身就是

通過時,它的聲明初始化變量修復此效率非常低,因爲字符串是不可變的,所以每個級聯都會創建一個全新的實例。使用StringBuilder可以通過使用單個緩衝區來防止這種情況。

+0

+1關於@Bob的注意事項,除非您想解決性能/內存使用問題,否則「更好」之後的所有內容都可以忽略。這是重要的信息,但與您的「未分配變量」問題無關。 – dss539 2010-05-10 20:27:42

1

編譯器必須考慮到while循環條件中的Data1.Read()永遠不會返回true的可能性。如果發生這種情況,那麼Tags_collect永遠不會被初始化,因此就是錯誤。

2

因爲如果Data1.Read()在開始時返回錯誤Tags_collect未分配。

1

你需要設置你的讀者喜歡這個小樣本while循環:

SqlDataReader的讀卡器= Command.ExecuteReader卻();

// Call Read before accessing data. 
    while (reader.Read()) 
    { 
     Console.WriteLine(String.Format("{0}, {1}", 
      reader[0], reader[1])); 
    } 
1

試試這個:

string Tags_collect=string.empty; 
相關問題