2010-10-05 1 views
1
string connectionString = ConfigurationManager.AppSettings["AllRttpDBConnectionString"]; 
MySqlConnection connection = new MySqlConnection(connectionString); 
MySqlCommand command = connection.CreateCommand(); 

command.CommandText = "Select * from test where ServiceName like 'T%' " ; 

try 
{ 
    connection.Open(); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.ToString()); 
} 

try 
{ 
    MySqlDataReader reader; 
    reader = command.ExecuteReader(); 

    while (reader.Read()) 
    { 
    Player.Name = reader["Name"].ToString(); 
    Player.Number = Convert.ToInt32(reader["Number"].ToString()); 

    //push to list 
    PlayerList.Add(Player); 
    } 

    connection.Close(); 
} 
catch (Exception e) 
{ 
    connection.Close(); 
    logger.Info(e.ToString()); 
} 

Выше приведен код, который я использую для чтения нескольких строк из базы данных в список. Однако все мои элементы списка имеют одни и те же данные (последняя строка базы данных).Чтение нескольких строк из базы данных - Где я ошибаюсь?

Я знаю, что это, вероятно, очень простая, глупая ошибка, но я просто не вижу ее.

ответ

6

Похоже, что вы добавляете один и тот же объект снова и снова, меняя значения прочитанного fromt текущей строки. Вам необходимо использовать:

Player player = new Player() 
player.Name = reader["Name"].ToString(); 
player.Number = Convert.ToInt32(reader["Number"].ToString()); 

//push to list 
PlayerList.Add(player); 

затем добавьте его в коллекцию.

+0

oh ... Я предположил, что он перезаписывает значения на каждой итерации цикла. Думаю, я был неправ. Позвольте мне попробовать ваше решение. – xbonez

+0

Это перезапись значений на каждой итерации, проблема в том, что вы добавляете один и тот же экземпляр снова и снова, потому что это тот же самый экземпляр, когда вы обновляете значение во время чтения, каждый элемент в списке обновляется, потому что все они являются тот же экземпляр объекта. – Daniel

+0

Спасибо. Это работает! – xbonez

4

Похоже, вы постоянно изменяете один экземпляр Player.

Чтобы это исправить, необходимо создать новый экземпляр для каждой записи:

while (reader.Read()) 
{ 
    // I'm guessing about the type here 
    Player player = new Player(); 
    player.Name = reader["Name"].ToString(); 
    player.Number = Convert.ToInt32(reader["Number"].ToString()); 

    //push to list 
    PlayerList.Add(player); 
} 
2

Так что происходит, вы не делаете новый Player каждый раз, когда вы добавляете его в список.

Ваш код, когда вы добавляете элементы в список, должен выглядеть примерно так.

PlayerClass NewPlayer = new PlayerClass; 
NewPlayer.Name = reader["Name"].ToString(); 
NewPlayer.Number = Convert.ToInt32(reader["Number"].ToString()); 

//push to list 
PlayerList.Add(NewPlayer); 
2

Позвольте мне предложить вам небольшое улучшение на ваш код:

public IEnumerable<Player> GetPlayers() 
{ 
    string connectionString = ConfigurationManager.AppSettings["AllRttpDBConnectionString"]; 
    using (var conn = new MySqlConnection(connectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = "SELECT Name, Number FROM test WHERE ServiceName LIKE 'T%';"; 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       yield return new Player 
       { 
        Name = reader.GetString(0), 
        Number = reader.GetInt32(1) 
       }; 
      } 
     } 
    } 
} 

И когда вам нужно создать список:

List<Player> playersList = GetPlayers().ToList(); 

Вы также должны убедиться, правильно распоряжаться все доступные ресурсы, как в моем примере.

+0

Спасибо. Я вижу, что ты сделал. Я включу использование кодов кода в свой код. – xbonez

+0

Не только использование блоков, а также использование надлежащих методов в считывателе данных, что позволяет избежать наложения типов, а также возможность для ленивой загрузки, возвращая «IEnumerable » вместо списка, который позволяет избежать загрузки всех результатов в память, если это не требуется. –

Смежные вопросы