Partage
  • Partager sur Facebook
  • Partager sur Twitter

TimeSpan mysql

Sujet résolu
    31 janvier 2012 à 20:17:35

    Bonjours

    Je voudrais savoir comment on met une donnée de type TimeSpan sur une base de données MySQL
    J'ai tenté d'utiliser un DATETIME ou un TIME mais sans succès
    ----31/01/2012 20:15:51 ----
    Type: MySqlException
    Source: MySql.Data
    Message: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':00:18.1290369 WHERE Name='test'' at line 1
    Target: ReadPacket
    Trace:    à MySql.Data.MySqlClient.MySqlStream.ReadPacket()
       à MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId)
       à MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int32& insertedId)
       à MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId)
       à MySql.Data.MySqlClient.MySqlDataReader.NextResult()
       à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
       à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
       à MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
       à MCLawl.MySQL.executeQuery(String queryString, Boolean createDB) dans C:\Users\Nicolas\minecraft\MCLawlSource nouveau systeme\MCLawl\MySQL.cs:ligne 32
    
    -------------------------


    Je voudrais utiliser ça pour sauvegarder un temps de jeu sur un serveur.

    Merci

    nico69
    • Partager sur Facebook
    • Partager sur Twitter
    "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
      3 février 2012 à 11:30:09

      Je ne trouve toujours rien depuis ces 4 jours.
      Et je ne vois pas quel type utiliser pour sauvegarder la valeur.
      http://dev.mysql.com/doc/refman/5.0/fr [...] me-types.html

      PS : je vient de voir que j'aurais du poster ce sujet dans "bases de données", si un modo veut bien le déplacer
      merci
      • Partager sur Facebook
      • Partager sur Twitter
      "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
        3 février 2012 à 14:59:43

        Salut,

        Montre ta requête, j'ai l'impression que c'est toi qui a une erreur dedans, car un TIME est tout à fait approprié pour enregistrer un TimeSpan.
        • Partager sur Facebook
        • Partager sur Twitter
          4 février 2012 à 1:40:09

          Je lui envois une chaine contenant ceci :
          ", totalTimePlayed=" + DateTime.Now.Subtract(totalTimePlayed).ToString() + //et le reste
          


          Je définit totalTimePlayed comme ceci :
          DateTime totalTimePlayed = DateTime.Now;
          try { totalTimePlayed = DateTime.Now.Subtract(TimeSpan.Parse(playerDb.Rows[0]["totalTimePlayed"].ToString())); }
          catch { totalTimePlayed = DateTime.Now; }
          


          Pour faire simple, le totalTimePlayed doit contenir l'heure d'arrivée du joueur si il aurais jouer toutes les heures d'un coup.
          Ensuite j'ai plus qu'a enlever la date actuelle pour avoir le temps joueur total.
          J’essaie d'utiliser cette méthode car elle n'utilise pas de puissance pour "compter"
          Après il se peut que je me trompe sur toute la ligne

          Aussi j'ai lu qu'un TIME ne peut contenir que 24H et je pence que je devrais stoker des temps de jeu beaucoup plus élevé
          • Partager sur Facebook
          • Partager sur Twitter
          "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
            4 février 2012 à 6:09:35

            Tu envoie un DateTime dans ta requête. elle devrait donc être construite comme ceci :

            ", totalTimePlayed='" + DateTime.Now.Subtract(totalTimePlayed).ToString() + "'"//et le reste
            

            (ajout de ' si c'Est pas clair :-° )

            Et puis bon... je comprend pas pourquoi tu envoie une date antérieure a un temps jouer... au lieu du temps jouer, directement :/, mais bon, pas mon problème :D


            Citation : n!co69


            Aussi j'ai lu qu'un TIME ne peut contenir que 24H et je pence que je devrais stoker des temps de jeu beaucoup plus élevé



            Uh... le TIME MySQL ne contient pas que 24h...
            • Partager sur Facebook
            • Partager sur Twitter
              4 février 2012 à 11:02:35

              ça ne fonctionne pas même avec les '

              Pourtant le format de la chaine est bonne d’après les docs ...

              Citation : http://dev.mysql.com/doc/refman/5.0/fr/time.html


              Vous pouvez aussi utiliser l'une des syntaxes alternatives suivantes : HH:MM:SS.fraction, HH:MM:SS, HH:MM, D HH:MM:SS, D HH:MM, D HH ou SS. Ici, D peut prendre des valeurs entre 0 et 33.



              ----04/02/2012 10:52:03 ----
              Type: MySqlException
              Source: MySql.Data
              Message: Incorrect time value: '00:00:24.2163851' for column 'totalTimePlayed' at row 918
              Target: ReadPacket
              Trace:    à MySql.Data.MySqlClient.MySqlStream.ReadPacket()
                 à MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId)
                 à MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int32& insertedId)
                 à MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId)
                 à MySql.Data.MySqlClient.MySqlDataReader.NextResult()
                 à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
                 à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
                 à MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
                 à MCLawl.MySQL.executeQuery(String queryString, Boolean createDB) dans C:\Users\Nicolas\minecraft\MCLawlSource nouveau systeme\MCLawl\MySQL.cs:ligne 32
              
              -------------------------


              Le truc c'est de sauvegarder le temps joué (par exemple 8h) lorsque le joueur se déconnecte.
              Lorsque il se reconnecte, on soustrais le temps joué précédemment a sa date de connexion.
              Lorsque il se redéconnecte on recommence dans l'autre sens : on enlève la date d'arrivé moins le temps joué (définit a la connexion) a la date actuelle pour avoir le temps joué total.
              En espérant avoir été plus clair
              • Partager sur Facebook
              • Partager sur Twitter
              "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
                4 février 2012 à 21:18:49

                T'as changer ton ToString() pour un ToString("HH:MM:SS") ? ou autre format, peu importe.
                • Partager sur Facebook
                • Partager sur Twitter
                  5 février 2012 à 16:56:51

                  un TimeSpan.ToString() ne prend aucun paramètres

                  EDIT : J'ai réussi

                  Le TIME n'accepte pas les fractions de secondes (même si c'est écrit qu'il les accepte dans la doc)

                  string TimePlayed = DateTime.Now.Subtract(totalTimePlayed).ToString();
                  string commandString = [...] ", totalTimePlayed='" + TimePlayed.Remove(TimePlayed.IndexOf('.')) + "'" + [...]
                  


                  Merci beaucoup

                  Problème résolu
                  • Partager sur Facebook
                  • Partager sur Twitter
                  "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
                    5 février 2012 à 22:10:57

                    Citation : M4N!aC

                    Tu envoie un DateTime dans ta requête. elle devrait donc être construite comme ceci :

                    ", totalTimePlayed='" + DateTime.Now.Subtract(totalTimePlayed).ToString() + "'"//et le reste
                    

                    Sacrilège ! >_<
                    On ne construit jamais une requête SQL en concaténant des strings.

                    n!co69 n'aurait pas eu de problème s'il avait utilisé correctement les paramètres de requête ! :-°
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 février 2012 à 23:07:15

                      Citation : Orwell

                      Citation : M4N!aC

                      Tu envoie un DateTime dans ta requête. elle devrait donc être construite comme ceci :

                      ", totalTimePlayed='" + DateTime.Now.Subtract(totalTimePlayed).ToString() + "'"//et le reste
                      


                      Sacrilège ! >_<
                      On ne construit jamais une requête SQL en concaténant des strings.

                      n!co69 n'aurait pas eu de problème s'il avait utilisé correctement les paramètres de requête ! :-°



                      Si si, je sais :-° Mais les mauvaises habitudes (aka norme de prog de ma compagnie faite par un analyste qui ne connais pas C# :colere2: ...) sont restées et j'y pense pas rapidement >_<
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 février 2012 à 21:17:05

                        Ça devient un peut hard la ...

                        J'ai toujours utiliser mysql comme ceci et je n'ai jamais eu de problèmes (sauf pour ce timespan qui maintenant fonctionne bien)

                        Ne pas concaténer des string pour une requête mysql est t'il très important ou c'est juste une "méthode" a respecter ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
                          6 février 2012 à 21:40:02

                          Citation : n!co69

                          Ça devient un peut hard la ...

                          J'ai toujours utiliser mysql comme ceci et je n'ai jamais eu de problèmes (sauf pour ce timespan qui maintenant fonctionne bien)

                          Ne pas concaténer des string pour une requête mysql est t'il très important ou c'est juste une "méthode" a respecter ?



                          Faire des requêtes comme tu le fais est un énorme risque de sécurité, tout simplement. Et du travail de plus. Ça laisse la porte ouverte à du SQL Injection (entre-autres). Tu doit donc valider à la main toutes les variables, ce que fait déjà une requetes qui utilise les paramètres de requêtes.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 février 2012 à 20:07:58

                            Je vient de comprendre les risques.
                            http://fr.wikipedia.org/wiki/Injection_SQL

                            Mais je ne stock pas de données "importantes" sur mysql.
                            De plus ces types de problèmes ne peuvent pas arriver car toutes les variables sont géré par le serveur.

                            Merci pour le conseil, ça me servira si j'utilise mysql pour des éléments plus important ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                            "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
                              8 février 2012 à 11:17:48

                              Autant prendre les bonnes habitudes tout de suite, et ça simplifiera même l'écriture et la maintenance de tes requêtes. ;)
                              • Partager sur Facebook
                              • Partager sur Twitter

                              TimeSpan mysql

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown