Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

TimeSpan mysql

Pour accéder à cette section
Connectez-vous !
connexion_rpx

Résolu Le problème de ce sujet a été résolu

Offre d'emploi : Développeur .NET/Java en start-up innovante (H/F)

Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne n!co69 # Posté le 31/01/2012 à 20:17:35
Avatar

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
Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
----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

Le zéro est le seul chiffre qui permet de compter jusqu'à 1.

 
Publicité # Posté le 31/01/2012 à 20:17:35

Hors ligne n!co69 # Posté le 03/02/2012 à 11:30:08
Avatar

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

Le zéro est le seul chiffre qui permet de compter jusqu'à 1.

 
Hors ligne M4N!aC # Posté le 03/02/2012 à 14:59:43
Aperçu des compétences
Avatar

Ville : Montréal
Pays : Canada

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.

Mon Blog!
Sujet Résolu? Image utilisateur ;)
Aide en .Net? (C#/WinForms) Je suis là!
 
Hors ligne n!co69 # Posté le 04/02/2012 à 01:40:09
Avatar

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


Je définit totalTimePlayed comme ceci :
Code : C#
1
2
3
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é

Le zéro est le seul chiffre qui permet de compter jusqu'à 1.

 
Hors ligne M4N!aC # Posté le 04/02/2012 à 06:09:35
Aperçu des compétences
Avatar

Ville : Montréal
Pays : Canada

Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
Tu envoie un DateTime dans ta requête. elle devrait donc être construite comme ceci :

Code : C#
1
", 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...

Mon Blog!
Sujet Résolu? Image utilisateur ;)
Aide en .Net? (C#/WinForms) Je suis là!
 
Hors ligne n!co69 # Posté le 04/02/2012 à 11:02:35
Avatar

ç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.


Code : Erreur
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
----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
Édité le 04/02/2012 à 11:03:32 par n!co69

Le zéro est le seul chiffre qui permet de compter jusqu'à 1.

 
Hors ligne M4N!aC # Posté le 04/02/2012 à 21:18:48
Aperçu des compétences
Avatar

Ville : Montréal
Pays : Canada

T'as changer ton ToString() pour un ToString("HH:MM:SS") ? ou autre format, peu importe.

Mon Blog!
Sujet Résolu? Image utilisateur ;)
Aide en .Net? (C#/WinForms) Je suis là!
 
Hors ligne n!co69 # Posté le 05/02/2012 à 16:56:50
Avatar

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)

Code : C#
1
2
string TimePlayed = DateTime.Now.Subtract(totalTimePlayed).ToString();
string commandString = [...] ", totalTimePlayed='" + TimePlayed.Remove(TimePlayed.IndexOf('.')) + "'" + [...]


Merci beaucoup

Problème résolu
Édité le 05/02/2012 à 17:06:00 par n!co69

Le zéro est le seul chiffre qui permet de compter jusqu'à 1.

 
Hors ligne Orwell # Posté le 05/02/2012 à 22:10:57
tahc nu sap tse'n icec
Avatar
Validateurs

Ville : Paris
Pays : France métropolitaine
Études : FSA ULB

Citation : M4N!aC
Tu envoie un DateTime dans ta requête. elle devrait donc être construite comme ceci :
Code : C#
1
", 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 ! :-°

Tuto en beta-test : Entity Framework
Mon appli Windows Phone : Deezy
 
Hors ligne M4N!aC # Posté le 05/02/2012 à 23:07:14
Aperçu des compétences
Avatar

Ville : Montréal
Pays : Canada

Citation : Orwell
Citation : M4N!aC
Tu envoie un DateTime dans ta requête. elle devrait donc être construite comme ceci :
Code : C#
1
", 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 >_<

Mon Blog!
Sujet Résolu? Image utilisateur ;)
Aide en .Net? (C#/WinForms) Je suis là!
 
Hors ligne n!co69 # Posté le 06/02/2012 à 21:17:05
Avatar

Ç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 ?

Le zéro est le seul chiffre qui permet de compter jusqu'à 1.

 
Hors ligne M4N!aC # Posté le 06/02/2012 à 21:40:02
Aperçu des compétences
Avatar

Ville : Montréal
Pays : Canada

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.

Mon Blog!
Sujet Résolu? Image utilisateur ;)
Aide en .Net? (C#/WinForms) Je suis là!
 
Hors ligne n!co69 # Posté le 07/02/2012 à 20:07:58
Avatar

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

Le zéro est le seul chiffre qui permet de compter jusqu'à 1.

 
Hors ligne Orwell # Posté le 08/02/2012 à 11:17:47
tahc nu sap tse'n icec
Avatar
Validateurs

Ville : Paris
Pays : France métropolitaine
Études : FSA ULB

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

Tuto en beta-test : Entity Framework
Mon appli Windows Phone : Deezy
 

Retour au forum "C# .NET & VB .NET" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx