为什么我的SQLDataReader只是从数据库表中读取最后一行?

时间:2012-03-10 12:37:34

标签: c# asp.net visual-studio-2010 sqldatareader

相同的查询在SQL Server中正常工作。我需要它来返回从c#中的DB表中读取的所有行。

SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = @"SELECT TypeName, Sum(HitNo) FROM TypeHit GROUP BY TypeName";

SqlDataReader sdr = cmd1.ExecuteReader();
sdr.Read();

if (sdr.HasRows)
{
   while (sdr.Read())
   {
       TextBox1.Text = sdr.GetString(0) +" at " + sdr.GetInt32(1);
   }
}

3 个答案:

答案 0 :(得分:1)

为什么使用sdr.Read(),这会让读者进入下一个数据块?

DataReader.Read Method

由于TextBox是一个循环,你还会覆盖读者中每条记录的while (sdr.Read())' - Text属性。

using(SqlDataReader sdr = cmd1.ExecuteReader())
{
        if (sdr.HasRows)
        {
            while (sdr.Read())
            {
                TextBox1.Text += sdr.GetString(0) + " at " + sdr.GetInt32(1) + Environment.NewLine;
            }
        }
        else
        {
            TextBox1.Text = "No rows found.";
        }
}

Retrieving Data Using a DataReader (ADO.NET)

答案 1 :(得分:0)

你需要在循环中附加结果:

TextBox1.Text = TextBox1.Text+sdr.GetString(0) +" at " + sdr.GetInt32(1);

此外,从性能的角度来看,最好使用StringBuilder

StringBuilder bld = new StringBuilder();
if (sdr.HasRows)    
{    
   while (sdr.Read())    
   {    
      bld.Append(sdr.GetString(0));
      bld.Append(" at ");
      bld.Append(sdr.GetInt32(1));    
    }    
 }
 TextBox1.Text = bld.ToString();

答案 2 :(得分:0)

在每个循环中,用提取的数据替换最后一个TextBox1.Text 所以你最后只得到最后一行。如果你需要看到所有结果,你需要这样的东西。

   StringBuilder sb = new StringBuilder();
   while (sdr.Read()) 
   { 
       sp.AppendLine(sdr.GetString(0) +" at " + sdr.GetInt32(1)); 
   } 
   TextBox1.Text = sb.ToString();

还将TextBox MultiLine 属性更改为 True 调整大小 TextBox1以显示多行

哎...在循环之前错过了伪造的sdr.Read()....