Problème de requête paramétrée [Résolu]

loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 12 févr. 2008 à 10:57 - Dernière réponse : loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention
- 21 févr. 2008 à 09:18
Bonjour tout le monde,

Je souhaite réaliser une requête paramétrée.

J'ai réalisé quelque chose mais malheureusement cela ne fonctionne pas.

EXPLICATION :  Le code ci-dessous doit me permettre d'afficher le statut correspondant au client choisi précédemment c'est à dire que je choisi le client puis ensuite, le statut est afficher dans ma combo qui se nomme StatuClient.
Pourquoi une combo?? pour que si le client n'existe pas, on le créé et kon puise choisir son statut.

CODE :
SqlConnection connection;

SqlCommand command;

connection =

new SqlConnection("Data Source=DIST-5B8D87E3A9;Initial Catalog=DistribInfo;Integrated Security=SSPI");connection.Open();

string requete = ("SELECT C_STATUCLT FROM CLIENT WHERE CLIENT.C_NOMCLT= @NomClt");command =

new SqlCommand(requete,connection);command.Parameters.Add("@NomClt", SqlDbType.VarChar);

command.Parameters["@NomClt"].Value = NomClient;

SqlDataReader rader = command.ExecuteReader();

try{

while (rader.Read()) StatuClient.Items.Add(rader.GetString(0));

}

catch(Exception ee){

MessageBox.Show(ee.Message);

}

finally{

connection.Close();

}
 
Lorsque je lance mon application (sous VisualStudio.net 2003) , je choisi le client et ensuite, il m'affiche le message d'erreur suivant :
" Une exception non gérée du type 'System.InvalidCastException' s'est produite dans system.data.dll

Informations supplémentaires : L'objet doit implémenter IConvertible. "

et il me surligne en vert le code suivant  : "SqlDataReader rader = command.ExecuteReader();"

merci d'avance pour votre aide.
Afficher la suite 

6 réponses

Répondre au sujet
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 21 févr. 2008 à 09:18
+3
Utile
C'est bon j'ai réussit en refaisant paramètre par paramètre.

merci quand même coq.

voici le code :
// Enregistrement des informations de l'intervention
SqlParameter paramNInter new SqlParameter("@NumInter", SqlDbType.VarChar, 15);paramNInter.Value NumIntervention.Text;
SqlParameter paramNClt new SqlParameter("@NumClt", SqlDbType.VarChar, 13);paramNClt.Value NumClt.Text;
SqlParameter paramNClt1 new SqlParameter("@NumClt1", SqlDbType.VarChar, 13);paramNClt1.Value NumClt.Text;
SqlParameter paramIdMat new SqlParameter("@IdMat", SqlDbType.Decimal, 9);paramIdMat.Value
decimal.Parse(NumMachine.Text);SqlParameter paramResInter new SqlParameter("@ResInter", SqlDbType.VarChar, 250);paramResInter.Value RaisonInter.Text;
SqlParameter paramLieuInter new SqlParameter("@LieuInter", SqlDbType.Text, 16);paramLieuInter.Value LieuInter.SelectedItem.ToString();

string strSql =
string.Format("INSERT INTO INTERVENTION(IN_NUMINTER, IN_NUMCLT, IN_M_NUMCLT, IN_IDMAT, IN_RESINTER, IN_ETAINTER, IN_LIEINTER) VALUES({0},{1},{2}, {3}, {4}, 'demande', {5})", paramNInter.ParameterName, paramNClt.ParameterName, paramNClt1.ParameterName, paramIdMat.ParameterName, paramResInter.ParameterName, paramLieuInter.ParameterName);

SqlCommand cmd =

new SqlCommand(strSql, connection);cmd.Parameters.Add(paramNInter);

cmd.Parameters.Add(paramNClt);

cmd.Parameters.Add(paramNClt1);

cmd.Parameters.Add(paramIdMat);

cmd.Parameters.Add(paramResInter);

cmd.Parameters.Add(paramLieuInter);

cmd.ExecuteNonQuery();

}

cordialement.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de loic20h28
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 12 févr. 2008 à 11:14
0
Utile
Je vient de tester la requête sous l'analyseur de requête de SqlServer grâce au debuggage et a l'espion (ajouter un espion) mais le problème c'est qu'il ne change pas @nomclt avec le résultat choisi précédement c'est à dire que @nomClt reste @nomClt.


Il vient peut être de la mon problème?? Qu'en pensez-vous??


Faut savoir également que quand j'ai voulu tester avec l'analyseur de requête, il m'a affiché :
Serveur : Msg 137, Niveau 15, État 2, Ligne 1
La variable @nomclt  doit être déclarée.


comment je peux résoudre ce problème d'après vous??


merci d'avance!!
Commenter la réponse de loic20h28
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 14 févr. 2008 à 09:52
0
Utile
Bonjour tout le monde,

Voila j'ai continué malgrés que personne a pu m'aider mais malheureusement cela ne fonctionne toujours pas.

CODE :
SqlConnection connection;

SqlCommand command;

connection =

new SqlConnection("Data Source=DIST-5B8D87E3A9;Initial Catalog=DistribInfo;Integrated Security=SSPI");connection.Open();

string requete = ("SELECT C_STATUCLT FROM CLIENT WHERE CLIENT.C_NOMCLT= @NomClt");command =

new SqlCommand(requete,connection);command.Parameters.Add("@NomClt", SqlDbType.Char, 20);

command.Parameters["@NomClt"].Value = NomClient.Items.ToString();

SqlDataReader rader = command.ExecuteReader();

try{

while (rader.Read()){

string
value =
null;

// On part du principe que le champ à l'index 0 est de type char dans la base

if (rader.IsDBNull(0) ==
false){

value = rader["C_STATUCLT"].ToString();StatutClient.Items.Add(

value);}

}

}

catch(Exception ee){

MessageBox.Show(ee.Message);

}

finally{

connection.Close();

}

Le problème c'est que ça m'affiche rien dans ma combo StatutClient.

merci d'avance pour votre aide.
Commenter la réponse de loic20h28
loic20h28 207 Messages postés mardi 19 juin 2007Date d'inscription 22 février 2016 Dernière intervention - 15 févr. 2008 à 14:49
0
Utile
Bonjour tout le monde,

j'ai changé de requête paramétré mais toujours bloqué. Enfin le problème est devenu plus clair dans ma tête.

CODE :
private

void Valider_Click(
object sender, System.EventArgs e){

SqlConnection connection;

connection =

new SqlConnection("Data Source=DIST-5B8D87E3A9;Initial Catalog=DistribInfo;Integrated Security=SSPI");connection.Open();

try{
SqlParameter paramNInter new SqlParameter("@NumInter", SqlDbType.VarChar, 15);paramNInter.Value NumIntervention;
SqlParameter paramNClt new SqlParameter("@NumClt", SqlDbType.VarChar, 13);paramNClt.Value NumClt;
SqlParameter paramNClt1 new SqlParameter("@NumClt1", SqlDbType.VarChar, 13);paramNClt1.Value NumClt;
SqlParameter paramNMat new SqlParameter("@NumMachine", SqlDbType.Int, 13);paramNMat.Value NumMachine;
SqlParameter paramResInter new SqlParameter("@RaisonInter", SqlDbType.VarChar, 250);paramResInter.Value RaisonInter;
SqlParameter paramLieInter new SqlParameter("@LieInter", SqlDbType.Text);paramLieInter.Value LieuInter.SelectedItem.ToString();
SqlParameter paramDepo new SqlParameter("@Depositaire", SqlDbType.Char, 50);paramDepo.Value Dépositaire.SelectedItem.ToString();
SqlParameter paramRecep new SqlParameter("@Receptionneur", SqlDbType.Char, 20);paramRecep.Value Réceptionneur.SelectedItem.ToString();
SqlParameter paramDPrisCharg new SqlParameter("@DatePrisEnCharge", SqlDbType.DateTime, 8);paramDPrisCharg.Value DatePrisEnCharge;

string sql =
string.Format("INSERT INTO INTERVENTION(IN_NUMINTER, IN_NUMCLT, IN_M_NUMCLT, IN_IDMAT, IN_RESINTER, IN_LIEINTER, IN_DEPOMAT, IN_RECEPMAT, IN_PRICHARG) VALUES({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7})", paramNInter.ParameterName, paramNClt.ParameterName,

paramNClt1.ParameterName, paramNMat.ParameterName,

paramResInter.ParameterName, paramLieInter.ParameterName,

paramDepo.ParameterName, paramRecep.ParameterName,

paramDPrisCharg.ParameterName);

SqlCommand cmd =

new SqlCommand(sql.ToString(), connection);cmd.Parameters.Add(paramNInter);

cmd.Parameters.Add(paramNClt);

cmd.Parameters.Add(paramNClt1);

cmd.Parameters.Add(paramNMat);

cmd.Parameters.Add(paramResInter);

cmd.Parameters.Add(paramLieInter);

cmd.Parameters.Add(paramDepo);

cmd.Parameters.Add(paramRecep);

cmd.Parameters.Add(paramDPrisCharg);

cmd.ExecuteNonQuery();

}

catch(Exception ex){

MessageBox.Show(ex.Message);

}

finally{

connection.Close();

}

}

J'ai besoin de 3 renseignements : 
  * Lorsqu'un champ dans la base est de type numéric, quelle type dois-je donner au paramètre au niveau du 'sqlDbType' ???
* Le NumIntervention est un label dans mon application donc pour qu'il prenne la valeur, que dois-je mettre?? pour l'instant j'ai : <!-- BEGIN TEMPLATE: bbcode_code -->

Code :
SqlParameter paramNInter = new SqlParameter("@NumInter", SqlDbType.VarChar, 15);
paramNInter.Value = NumIntervention;

<!-- END TEMPLATE: bbcode_code -->* La DatePrisCharg me renvoie "02/15/2008", comment puis-je faire pour que ça devienne "12/02/2008"?? <!-- BEGIN TEMPLATE: bbcode_code -->

Code :
SqlParameter paramDPrisCharg = new SqlParameter("@DatePrisEnCharge", SqlDbType.DateTime, 8);
paramDPrisCharg.Value = DatePrisEnCharge.Format;

<!-- END TEMPLATE: bbcode_code -->Je sait qu'il existe Format(mais ça renvoie short) et il existe FormatChanged mais il me dise qu'il faut que je le mette à guche d'un = ou d'un +, comment puis-je faire dans mon programme??

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 - 17 févr. 2008 à 01:37
0
Utile
Salut,

Là à mon avis il vaut mieux que tu fasses une pause et que tu te penches sur la doc de ce que tu utilises, tu perdrais beaucoup moins de temps qu'en te lancant directement la tête dans le guidon.

Si je comprend bien, NomClient est une instance de la classe ComboBox, et je vois mal comment le code de la classe SqlParameter saurait comment aller chercher la chaine de caractère contenant le nom du client, surtout que la partie accès aux données du framework ne dépend heureusement pas du code de présentation.

"Lorsqu'un champ dans la base est de type numéric, quelle type dois-je donner au paramètre au niveau du 'sqlDbType' ???"
=> Logiquement, numeric est à associer à un type Decimal, voir doc SQL Server et doc de l'énumération SqlDbType

"Le NumIntervention est un label dans mon application donc pour qu'il prenne la valeur, que dois-je mettre?? pour l'instant j'ai :"
=> Pour NumIntervention, même réflexion que pour NomClient : le paramètre attend la valeur dans le bon type, à toi de l'extraire.

"La DatePrisCharg me renvoie "02/15/2008", comment puis-je faire pour que ça devienne "12/02/2008"?? "
=> Lire la doc de DateTimePicker.Format, puis celle de DateTimePicker pour trouver comment récupérer la date sélectionnée.
"Je sait qu'il existe Format(mais ça renvoie short) et il existe FormatChanged mais il me dise qu'il faut que je le mette à guche d'un ou d'un +, comment puis-je faire dans mon programme??"> FormatChanged est un event ! Se renseigner sur ce que sont les évènements, et lire la doc de DateTimePicker.

/*
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 - 19 févr. 2008 à 09:47
0
Utile
Je récupére la bonne date sauf que ça me met "02/19/2008" au lieu de "19/02/2008" c'est à dire que je veux que dans ma base, il me le mete de type "jour/mois/année" et non de type "mois/jours/années".
J'ai lu quelque pars qu'en laissant mon code de cette manière : SqlParameter paramDPrisCharg new SqlParameter("@DatePrisEnCharge", SqlDbType.DateTime, 8);paramDPrisCharg.Value DatePrisEnCharge;

dans ma base il me l'affichera normalement. Qu'en penses tu??
Mais j'insiste sur le fait qu'il me renvoie bien les valeurs, donc tu pense que même que le problème vient de la??

Merci d'avance!!
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.