2017-01-11 1 views
0

J'utilise ce code dans mon bot de twitch pour compter les messages et les enregistrer dans une base de données quelques fois par minute.Insérer et mettre à jour les valeurs mysql C#

Ainsi le code que j'ai actuellement obtient les valeurs que je veux de ma base de données, mais je ne peux pas mettre à jour ou insérer correctement les valeurs. L'insert_cmd s'exécute, mais les valeurs dans la base de données ne correspondent pas aux valeurs que j'essaie d'insérer. affectedRows renvoie la réponse correcte des lignes qui auraient dû être affectées. Aussi quand j'écris la chaîne insert_cmd, elle a l'air juste.

 private static void update_messages() 
    { 
     try 
     { 
      MySql.Data.MySqlClient.MySqlConnection mysql_connection = new MySql.Data.MySqlClient.MySqlConnection(); 
      mysql_connection.ConnectionString = mysql_connection_string; 
      mysql_connection.Open(); 

      //build query string 
      string select_cmd = "SELECT * FROM taperen.messages where username in ("; 
      foreach(CountData cd in chat_messages) 
      { 
       //Console.WriteLine(cd.username); 
       select_cmd += "\'" + cd.username + "\',"; 
      } 
      if(select_cmd == "SELECT * FROM taperen.messages where username in (") 
      { 
       mysql_connection.Close(); 
       return; 
      } 
      select_cmd = select_cmd.TrimEnd(select_cmd[select_cmd.Length - 1]); 
      select_cmd += ");"; 
      //Console.WriteLine(select_cmd); 


      MySql.Data.MySqlClient.MySqlCommand myCommand = mysql_connection.CreateCommand(); 
      myCommand.CommandText = select_cmd; 
      MySql.Data.MySqlClient.MySqlDataReader reader = myCommand.ExecuteReader(); 


      string insert_cmd = ""; 
      while (reader.Read()) 
      { 
       string username = reader["username"].ToString(); 
       int index = chat_messages.FindIndex(x => x.username.Equals(username)); 

       int current_online_count = chat_messages[index].online_count; 
       int current_offline_count = chat_messages[index].offline_count; 

       int db_online_count = (int)reader["online_count"]; 
       int db_offline_count = (int)reader["offline_count"]; 

       int new_online_count = current_online_count + db_online_count; 
       int new_offline_count = current_offline_count + db_offline_count; 
       insert_cmd += $"UPDATE `taperen`.`messages` SET `online_count`='{new_online_count}', `online_count`='{new_offline_count}' WHERE `id`='{reader["id"]}';"; 

       chat_messages.RemoveAt(index); 
       //Console.WriteLine(username); 
      } 
      reader.Close(); 
      mysql_connection.Close(); 
      foreach(CountData cd in chat_messages) 
      { 
       insert_cmd += $"INSERT INTO `taperen`.`messages` (`username`, `online_count`, `offline_count`) VALUES ('{cd.username}', '{cd.online_count}', '{cd.offline_count}');"; 
      } 

      mysql_connection.Open(); 


      //Console.WriteLine(insert_cmd); 

      myCommand.CommandText = insert_cmd; 
      int affectedRows = myCommand.ExecuteNonQuery(); 
      Console.WriteLine(affectedRows); 
      myCommand.Dispose(); 

      mysql_connection.Close(); 
     } 
     catch (MySql.Data.MySqlClient.MySqlException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

La classe CountData ressemble à ceci:

public class CountData 
{ 
    public string username { get; set; } 
    public int online_count { get; set; } 
    public int offline_count { get; set; } 
} 

La base de données ressemble à ceci: database

Aussi, si je fais quelque chose d'autre stupide dans mon code, j'apprécierions si vous pouviez venir avec quelques conseils :)

+0

À quoi ressemble l'insert_cmd généré? – Jonny

Répondre

1

Dans cette ligne vous définissez deux fois online_count, la deuxième instance devrait (probablement) être offline_count.

insert_cmd + = $ "Mettre à Jour taperenmessages SET online_count = '{new_online_count}', online_count = '{} new_offline_count' OÙ id =. '{Lecteur [ "id"]}';";

+0

Une telle erreur stupide. Cela l'a corrigé, devinez que cela a gâché la requête. :) – toffaste1337

1

Vous devez choisir la requête générée par votre code. Ensuite, lancez-le directement dans Mysql, puis comparez ce qu'il retourne. Il semble que mysql retourne les lignes affectées de la dernière requête en cours d'exécution. Comme vous êtes en train de combiner Mettre à jour en premier, puis Insérer, d'où les lignes affectées qui obtiennent pour insérer. Mais vous pouvez le confirmer en exécutant directement votre requête. Assurez-vous de commenter le code comme ceci:

// int affectedRows = myCommand.ExecuteNonQuery();