Pb de format d'un dateTimePicker. [Résolu]

loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 6 mars 2008 à 09:57 - Dernière réponse : loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention
- 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 -->
Afficher la suite 

22 réponses

Répondre au sujet
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 16 mars 2008 à 17:53
+3
Utile
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
*/
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 6 mars 2008 à 10:23
0
Utile
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]
Commenter la réponse de sebmafate
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 6 mars 2008 à 14:49
0
Utile
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!!
Commenter la réponse de loic20h28
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 6 mars 2008 à 15:14
0
Utile
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]
Commenter la réponse de sebmafate
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 mars 2008 à 15:02
0
Utile
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
Commenter la réponse de loic20h28
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 mars 2008 à 15:13
0
Utile
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
*/
Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 mars 2008 à 15:21
0
Utile
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
*/
Commenter la réponse de cs_coq
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 mars 2008 à 15:39
0
Utile
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.
Commenter la réponse de loic20h28
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 mars 2008 à 15:46
0
Utile
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
*/
Commenter la réponse de cs_coq
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 mars 2008 à 15:57
0
Utile
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.
Commenter la réponse de loic20h28
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 mars 2008 à 16:06
0
Utile
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
*/
Commenter la réponse de cs_coq
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 mars 2008 à 16:12
0
Utile
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.
Commenter la réponse de loic20h28
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 mars 2008 à 16:36
0
Utile
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
*/
Commenter la réponse de cs_coq
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 mars 2008 à 16:44
0
Utile
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!!
Commenter la réponse de loic20h28
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 mars 2008 à 17:04
0
Utile
Format contient la chaine de formatage de la valeur, pas la valeur.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 mars 2008 à 17:17
0
Utile
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.
Commenter la réponse de loic20h28
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 mars 2008 à 17:36
0
Utile
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
*/
Commenter la réponse de cs_coq
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 mars 2008 à 18:18
0
Utile
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.)
Commenter la réponse de loic20h28
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 mars 2008 à 18:25
0
Utile
Ben Value avec le formatage voulu.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 mars 2008 à 18:43
0
Utile
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.
Commenter la réponse de loic20h28

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Pb de format d'un dateTimePicker. - page 2