loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 2016
-
6 mars 2008 à 09:57
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 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 -->
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);
<!-- 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 -->
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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");
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 20162 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.
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 20162 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."
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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);
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 20162 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."
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 20162 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
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 20162 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!!
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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);
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 20162 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.)