Pb de format d'un dateTimePicker.

Résolu
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 - 6 mars 2008 à 09:57
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 - 16 mars 2008 à 19:54
Bonjour tout le monde,

Voila j'ai une fenêtre dans le quelle on choisit le nom de l'intervenant via une comboBox. Puis 2 DateTimePicker de format "Short" et un label qui correspond au nombre d'intervention effectuée par l'intervenant choisi durant la période choisi(par les dataTimePicker).
Pour cela j'ai créé le code suivant :
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :

SqlConnection connection;
SqlCommand command;
SqlDataReader rader;
 
connection = new SqlConnection("Data Source=DIST-5B8D87E3A9;Initial Catalog=Distrib;Integrated Security=SSPI");

 command = new SqlCommand("SELECT COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbInterEffectue FROM INTERVENTION, OPERER, INTERVENANT WHERE INTERVENTION.IN_NUMINTER=OPERER.O_NUMINTER AND OPERER.O_CODVENAN=INTERVENANT.IT_CODVENAN AND INTERVENANT.IT_NOMVENAN = '" + NomIntervenant.Text + "' AND IN_NUMINTER BETWEEN '" + dateTimePicker1.Format.ToString("yyyy/MM/dd") + "' AND '" + dateTimePicker2.Format.ToString("yyyy/MM/dd") + "'", connection);

connection.Open();
try
{
   rader = command.ExecuteReader();
   try
   {
      while(rader.Read()) 
      NbInterEffectuée.Text = Convert.ToString(rader["NbInterEffectue"]);
   }
   finally{rader.Close();}
}
finally{connection.Close();}

<!-- END TEMPLATE: bbcode_code -->Mon problème est lorsque j'exécute mon application, il m'affiche l'erreur suivante : <!-- BEGIN TEMPLATE: bbcode_quote -->

Citation:
Une exception non gérée du type 'System.FormatException' s'est produite dans mscorlib.dll

Informations supplémentaires*: La chaîne de format ne peut être que "G","g","X","x","F","f","D" ou "d".

<!-- END TEMPLATE: bbcode_quote -->et me surligne en vert <!-- BEGIN TEMPLATE: bbcode_code -->

Code :

command = new SqlCommand(
"SELECT COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbInterEffectue
FROM INTERVENTION, OPERER, INTERVENANT
WHERE INTERVENTION.IN_NUMINTER=OPERER.O_NUMINTER
AND OPERER.O_CODVENAN=INTERVENANT.IT_CODVENAN
AND INTERVENANT.IT_NOMVENAN = '" + NomIntervenant.Text +
"'
AND IN_NUMINTER BETWEEN '" + dateTimePicker1.Format.ToString("yyyy/MM/dd") + "' AND '" + dateTimePicker2.Format.ToString("yyyy/MM/dd") + "'", connection);

<!-- END TEMPLATE: bbcode_code -->Faut savoir que IN_NUMINTER est de la forme : yyyy/MM/dd c'est pour ça que j'ai mit <!-- BEGIN TEMPLATE: bbcode_code -->

Code :
dateTimePicker2.Format.ToString("yyyy/MM/dd")

<!-- END TEMPLATE: bbcode_code -->Mais je vois pas par quoi remplacer yyyy/MM/dd ??

Je vous remercie d'avance pour votre aide!!

<!-- / message -->
<!-- sig -->
A voir également:

22 réponses

cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 mars 2008 à 17:53
Ben tu nous a dit que ta colonne de date en base était une colonne typée texte avec un formatage spécifique AAAA/MM/JJ, chose que moi (et porbablement seb) n'avions pas percutée au début, d'où notre proposition d'utiliser DateTime alors que dans ton cas tu es visiblement "contraint" de passer par du texte. Donc comme dit plus haut, la solution est d'utiliser un code similaire à celui de départ, sans toutefois se tromper de propriété, soit :


SqlParameter paramDateMin = new SqlParameter("@DateMin", SqlDbType.VarChar, 15);
paramDateMin.Value = dateTimePicker1.Value.ToString("yyyy/MM/dd");
SqlParameter paramDateMax = new SqlParameter("@DateMax", SqlDbType.VarChar, 15);
paramDateMax.Value = dateTimePicker2.Value.ToString("yyyy/MM/dd");

/*
coq
MVP Visual C#
CoqBlog
*/
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
6 mars 2008 à 10:23
Quand je pense qu'on se casse la tête à faire des tutos sur l'utilisations des requêtes paramétrées !

http://www.csharpfr.com/tutoriaux/UTILISATION-REQUETES-PARAMETREES-AVEC-ADO-NET_709.aspx

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
6 mars 2008 à 14:49
Voila j'ai essayé avec une requête paramétrée mais mon problème c'est que ça fonctionne pas.

Voici le code que ça me donne :
SqlConnection connection;
SqlCommand command;
SqlDataReader rader;
connection =

new SqlConnection("Data Source=DIST-5B8D87E3A9;Initial Catalog=Distrib;Integrated Security=SSPI");
SqlParameter paramNomIntervenant =
new SqlParameter("@NomIntervenant", SqlDbType.Char, 20);
paramNomIntervenant.Value = NomIntervenant.Text;
SqlParameter paramDateMin =
new SqlParameter("@DateMin", SqlDbType.DateTime, 8)
paramDateMin.Value = dateTimePicker1.Text;
SqlParameter paramDateMax =
new SqlParameter("@DateMax", SqlDbType.DateTime, 8);
paramDateMax.Value = dateTimePicker2.Text;

string sql = ("SELECT COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbInterEffectue FROM INTERVENTION, OPERER, INTERVENANT WHERE INTERVENTION.IN_NUMINTER=OPERER.O_NUMINTER AND OPERER.O_CODVENAN=INTERVENANT.IT_CODVENAN AND INTERVENANT.IT_NOMVENAN = '@NomIntervenant' AND IN_NUMINTER BETWEEN '@DateMin' AND '@DateMax'");
command =
new SqlCommand(sql, connection);
command.Parameters.Add(paramNomIntervenant);
command.Parameters.Add(paramDateMin);
command.Parameters.Add(paramDateMax);

Lorsque je suis en mode debbug et ke je regarde les ".Value" alors il me donne bien la valeur de mes paramètres.

merci d'avance!!
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
6 mars 2008 à 15:14
pourquoi utiliser dateTimePicker1.Text ? pourquoi ne pas utiliser dateTimePicker1.SelectedDate ?

dans la requête, il ne faut pas mettre les ' autour des paramètres

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
15 mars 2008 à 15:02
Bonjour sebmafate,

J'ai beau mettre ça revient au même, il m'affiche l'erreur suivante :
"System.Data.SqlClient.SqlException : La conversion d'un type de données CHAR e type DATETIME a donné une valeur dors des limites des valeurs de date et d'heure."

Si vous avez une idée j'en prendrais compte!!

Cordialement
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 mars 2008 à 15:13
Par interprétation directe des propos de seb :

SqlParameter paramNomIntervenant = new SqlParameter("@NomIntervenant", SqlDbType.Char, 20);
paramNomIntervenant.Value = NomIntervenant.Text;
SqlParameter paramDateMin = new SqlParameter("@DateMin", SqlDbType.DateTime, 8)
paramDateMin.Value = dateTimePicker1. SelectedDate ;
SqlParameter paramDateMax = new SqlParameter("@DateMax", SqlDbType.DateTime, 8);
paramDateMax.Value = dateTimePicker2. SelectedDate ;
string sql = ("SELECT COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbInterEffectue FROM INTERVENTION, OPERER, INTERVENANT WHERE INTERVENTION.IN_NUMINTER= OPERER.O_NUMINTER AND OPERER.O_CODVENAN=INTERVENANT.IT_CODVENAN AND INTERVENANT.IT_NOMVENAN = @NomIntervenant AND IN_NUMINTER BETWEEN @DateMin AND @DateMax");
command = new SqlCommand(sql, connection);
command.Parameters.Add(paramNomIntervenant);
command.Parameters.Add(paramDateMin);
command.Parameters.Add(paramDateMax);

Sinon question : quel est l'intérêt de ceci : "COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbInterEffectue" ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 mars 2008 à 15:21
Enfin, au passage seb nous a fait un mélange avec le côté sombre (les webberies :p), sur le DateTimePicker WinForm c'est la propriété Value, pas SelectedDate, ce qui nous donne :

SqlParameter paramNomIntervenant = new SqlParameter("@NomIntervenant", SqlDbType.Char, 20);
paramNomIntervenant.Value = NomIntervenant.Text;
SqlParameter paramDateMin = new SqlParameter("@DateMin", SqlDbType.DateTime, 8)
paramDateMin.Value = dateTimePicker1. Value ;
SqlParameter paramDateMax = new SqlParameter("@DateMax", SqlDbType.DateTime, 8);
paramDateMax.Value = dateTimePicker2. Value ;
string sql = ("SELECT COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbInterEffectue FROM INTERVENTION, OPERER, INTERVENANT WHERE INTERVENTION.IN_NUMINTER= OPERER.O_NUMINTER AND OPERER.O_CODVENAN=INTERVENANT.IT_CODVENAN AND INTERVENANT.IT_NOMVENAN = @NomIntervenant AND IN_NUMINTER BETWEEN @DateMin AND @DateMax");
command = new SqlCommand(sql, connection);
command.Parameters.Add(paramNomIntervenant);
command.Parameters.Add(paramDateMin);
command.Parameters.Add(paramDateMax);

/*
coq
MVP Visual C#
CoqBlog
*/
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
15 mars 2008 à 15:39
Bonjour coq,

"COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbInterEffectue" ?   --> Cela me permet de ompter le nombre d'intervention selon la date correspondant au IN_NUMINTER. C'est à dire, vu que IN_NUMINTER est de la forme : Date - 001 plus précisément année/mois/jours - 001.

Donc COUNT me permet de compter le nombr d'intervention et SUBSTRING et permet de prendre en compte juste la partie Date du champ.

Certe, je sais que remplir le champ IN_NUMINTER de cette façon est pas génial mais j'ai pas le choix car l'entreprise préfére.
J'ai testé cette requête en remplaçantles paramètres par des valeurs, et ça fonconne bien.

Lorsque 'essaye avec .Value, ça me dit la chose suivante : "System.Data.SqlClient.SqlException : La conversion d'un type de données CHAR e type DATETIME a donné une valeur dors des limites des valeurs de date et d'heure."

Merci d'avance pour votre aide.
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 mars 2008 à 15:46
Ok, j'aurais plutôt fait ça dans la clause WHERE.

Pour l'erreur, recommençons du début, redonne nous un peu la requête actuelle...

/*
coq
MVP Visual C#
CoqBlog
*/
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
15 mars 2008 à 15:57
Ok, j'aurais plutôt fait ça dans la clause WHERE. --> ben il me semble que tu peux pas uiliser des agrégats dans la clause where.

Pour l'erreur, recommençons du début, redonne nous un peu la requête actuelle... --> Voici la requête de départ c'est à dire celle que j'ai testé sous SqlServer 2000 : SELECT COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbreInterEffectue FROM INTERVENTION, OPERER, INTERVENANT WHERE INTERVENTION.IN_NUMINTER=OPERER.O_NUMINTER AND OPERER.O_CODVENAN=INTERVENANT.IT_CODVENAN AND INTERVENANT.IT_NOMVENAN = 'vivien' AND IN_NUMINTER BETWEEN '2008/02/01' AND '2008/02/30'

Ensuite j'ai voulu la créer avec paramètre ce qui donne :
"SqlParameter paramNomIntervenant =
new SqlParameter("@NomIntervenant", SqlDbType.Char, 20);
paramNomIntervenant.Value = NomIntervenant.Text;
SqlParameter paramDateMin =
new SqlParameter("@DateMin", SqlDbType.DateTime, 8);
paramDateMin.Value = dateTimePicker1.Value;
SqlParameter paramDateMax =
new SqlParameter("@DateMax", SqlDbType.DateTime, 8);
paramDateMax.Value = dateTimePicker2.Value;

SELECT COUNT(SUBSTRING(IN_NUMINTER, 1,10)) as NbreInterEffectue FROM INTERVENTION, OPERER, INTERVENANT WHERE INTERVENTION.IN_NUMINTER=OPERER.O_NUMINTER AND OPERER.O_CODVENAN=INTERVENANT.IT_CODVENAN AND INTERVENANT.IT_NOMVENAN = @NomIntervenant AND IN_NUMINTER BETWEEN @DateMin AND @DateMax

command.Parameters.Add(paramNomIntervenant);
command.Parameters.Add(paramDateMin);
command.Parameters.Add(paramDateMax);
"

Les dateTimePicker sont en format : hort donc de type "jour/mois/année".

Quoi dire d'autre? !!

Merci pour ton aide coq.
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 mars 2008 à 16:06
ben il me semble que tu peux pas uiliser des agrégats dans la clause where
=> oui je sais, je parlais juste du filtrage, pas du count

Sinon je suis perdu dans ton truc, ta colonne IN_NUMINTER est de quel type en base ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
15 mars 2008 à 16:12
oui je sais, je parlais juste du filtrage, pas du count  --> ok autant pour moi.

Sinon je suis perdu dans ton truc, ta colonne IN_NUMINTER est de quel type en base ?  -->  IN_NUMINTER est de typ VarChar(15) dans ma base.
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 mars 2008 à 16:36
Ok... nous, nous étions partis sur un stockage normal en base sous forme d'un datetime.
Donc forcément dans ton cas si on envoi un paramètre datetime, la conversion se fait dans le sens varchar => datetime du fait de la priorité.
Dans le cas présent le type de paramètre est donc clairement texte formaté correctement, comme tu l'avais fait au début sauf que tu t'étais complètement planté de propriété concernant la récupération de la valeur, qu'elle soit typée DateTime ou String... je t'invite donc à dégainer la doc pour regarder la page concernant DateTimePicker et plus précisément les pages des propriétés Format/Value/Text.

D'ailleurs maintenant maintenant qu'on en parle il me semble qu'un sujet similaire à été abordé il n'y a pas très longtemps sur le forum.

/*
coq
MVP Visual C#
CoqBlog
*/
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
15 mars 2008 à 16:44
Merci pour ta réponse, mais j'ai déja dégainé pas lmal de fois les docs sur DateTimePkcer et c'est pas pour ça que  j'arrive à résoudre mon problème.

Merci d'avance!!
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 mars 2008 à 17:04
Format contient la chaine de formatage de la valeur, pas la valeur.

/*
coq
MVP Visual C#
CoqBlog
*/
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
15 mars 2008 à 17:17
Format contient la chaine de formatage de la valeur, pas la valeur.  --> Je vois pas du tout ce que tu veux dire par là?? désolé tu va certainement me prendre pour un null mais je comprend pas trop!!

Cordialement.
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 mars 2008 à 17:36
Teste ce code, ça devrait te permettre de voir ce que je veux dire (en dehors du fait que je me suis mélangé les pinceaux, c'est CustomFormat qui contient la chaine de formatage et Format défini le mode de formatage) :

private void button1_Click(object sender, EventArgs e)
{
    DateTimePicker dtp = new DateTimePicker();
    dtp.Location = new Point(10, 10);
    dtp.Size = new Size(200, 20);
    this.Controls.Add(dtp);


    dtp.Format = DateTimePickerFormat.Long;
    dtp.Value = DateTime.Now;
    dtp.Text = DateTime.Now.ToString();
    MessageBox.Show(String.Format("Format : {0}\r\nValue : {1}\r\nText : {2}",
        dtp.Format,
        dtp.Value,
        dtp.Text)
        );
}

/*
coq
MVP Visual C#
CoqBlog
*/
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
15 mars 2008 à 18:18
Merci pour ton code, je comprend mieu ce que tu veux dire mais pas sur de bien voir la résolution a mon problème.

Car si j'ai bien compris, tu me conseillerais de mettre .Text??

En faite je doit être con c'estpas possible, car j'ai biencompris les différence entre .Text, .Value et .Format mais ce que je vois pas comment résoudre mon problème poutant jréfléchi!! (je devrai tétre arrété ca iré téte mieu!!LOL.)
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 mars 2008 à 18:25
Ben Value avec le formatage voulu.

/*
coq
MVP Visual C#
CoqBlog
*/
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
15 mars 2008 à 18:43
Ok mais j'ai essayé plusieurs choses mais ça fonctionne pas.

Donc je vois vraiment pas!!

suis désolé de t'embéter autant!!

Cordialement.
0
Rejoignez-nous