2010-05-10 98 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; 
相关问题