Почему мой SQLDataReader просто читает последнюю строку из таблицы базы данных? - PullRequest
1 голос
/ 10 марта 2012

Тот же запрос отлично работает в SQL Server.Мне нужно, чтобы вернуть все строки, прочитанные из таблицы БД в c #.

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 ]

1 голос
/ 10 марта 2012

Почему вы используете sdr.Read(), который продвинет читателя к следующему блоку данных?

DataReader.Read Метод

Вы также перезаписываетесвойство TextBox '- Text для каждой записи в считывателе, поскольку while (sdr.Read()) является циклом.

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.";
        }
}

Получение данных с использованием DataReader (ADO.NET)

0 голосов
/ 10 марта 2012

В каждом цикле вы заменяете последний 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 () перед циклом ....

0 голосов
/ 10 марта 2012

Вам необходимо добавить результат в цикл:

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();
...