C# / SQL SERVEUR / Requete insert [Résolu]

Messages postés
4
Date d'inscription
vendredi 10 avril 2009
Statut
Membre
Dernière intervention
18 mai 2009
- - Dernière réponse : mikl31140
Messages postés
2
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
8 juin 2009
- 8 juin 2009 à 12:21
Bon j'ai fait le tour du forum essayé plusieurs solution toute infructueuse apres venir honteusement poster ici mais je suis a bout ....

Le message d'erreur pour ce code si-dessous c'est (exemple le nom rentré est david dans la text box) :
Erreur[42000][Microsoft][ODBC SQL SERVER DRIVER][SQL serveur] Le nom "david" n'est pas autorisé dans ce contexte. Les expressions valides sont des constantes, des expressions constantes et (dans certains contextes) des variables. Les noms de colonnes ne sont pas autorisés.

private void cmd_ajoutertireur_Click(object sender, EventArgs e)
        {
            
            string requeteupdate =
"INSERT INTO dbo.Tireur (code_tireur,nom,prenom,num_rue,catégorie,codepostale,rue,ville)VALUES( "+txt_codeadd.Text+","+txt_nomadd.Text +" ," + txt_prenomadd.Text + "," + txt_numadadd.Text + "," + txt_catadd.Text + "," + txt_cpadd.Text + ", " + txt_rueadd.Text + ", " + txt_villeadd.Text + ")";

            try
            {
                  cnx = newOdbcConnection("Driver={SQL Server};Server=xxxxxxxx;Database=C36_xxxxxx;");

                cnx.Open();

                cmd = newOdbcCommand(requeteupdate, cnx);
                                       // cmd.Parameters.Add( "@nom", OdbcType.VarChar);

                                      //cmd.Parameters["@nom"].Value = txt_nomadd.Text;
                cmd.ExecuteNonQuery();
                

            }
            catch (Exception ex)
            {
                MainForm.ShowException(ex, "raté");
            }
        }
Ce qui est en commentaire je l'ai trouvé sur le forum normalement c'est sensée déclarer des variables dans la base

est par exemple écrire la requête ainsi : INSERT INTO Tireur(nom,...) values (@nom,...)

Âpres exécution j'ai le droit a ce message d'erreur "@nom" n'est pas déclaré. Bref

Si quelqu'un a une idée je vous en prit je suis a bout d'idée et j'i ce projet a rendre pour lundi prochain et j'ai encore a faire un delete qui je sent bien va me poser probleme...

A L'AIDE
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
1
3
Merci
Bonjour,

Le problème doit venir du fait que tu ne mets pas les données de type texte entre simple cotes.

Exemple :

Supposons que txt_nomadd.Text  contienne toto

","+txt_nomadd.Text +","  va te donner ,toto, alors qu'on veut ,'toto',
donc tu dois écrire ",'"+txt_nomadd.Text +"'," 

Tu peux aussi utilliser les requêtes paramétrées qui éviteront ce genre de bug.

ed73

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 186 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ed73
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
28
3
Merci
+1 ed73

En ce qui concerne les requêtes paramétrées, surtout n'hésite pas, c'est très très simple à utiliser et tu n'as pas à te soucier du format de ta variable. Tu as juste à dire s'il s'agit d'un entier, d'un float, d'un varchar, d'une date... et il va automatiquement transposer ta valeur comme il faut dans ta requête.

Pour les utiliser :
tu mets @UnNom dans ta requête ("SELECT * FROM table WHERE monChamp = @MonChamp")
Puis tu crées un OdbcParameter
avec comme Propriété ParameterName : "@MonChamp"
Value : ta valeur
OdbcType : OdbcType.TypeDeTaVariable
Et tu ajoutes ton paramètre à la collection Parameters de ta Command

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 186 internautes nous ont dit merci ce mois-ci

Commenter la réponse de krimog
Messages postés
2
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
8 juin 2009
0
Merci
Bonjour à tous!

Je me permet de poster ici, car j'ai moi même ce problème, mais ce coup-ci il provient d'un script:

voilà mon script

CREATE

TABLE [dbo]
.[TB_PRO_ACTIVITES_PROSPECT]
([ACP_PROSPECT] [dbo]

.[u_cle]
NOT
NULL,[ACP_ACTIVITES] [dbo]

.[u_cle]
NOT
NULL)

ON [PRIMARY]

GO

Insert

into
[dbo]
.
[TB_PRO_ACTIVITES_PROSPECT]
values

(
ACP_PROSPECT
,
ACP_ACTIVITES
)
Select

PRO_CLE
, PRO_ACTIVITE
from

TB_PRO_PROSPECTS
where

(PRO_ACTIVITE
is
not
null)

et le message d'erreur est le suivant:
Msg 128, Niveau 15, État 1, Ligne 2

Le nom "ACP_PROSPECT" n'est pas autorisé dans ce contexte. Les expressions valides sont des constantes, des expressions constantes et (dans certains contextes) des variables. Les noms de colonnes ne sont pas autorisés.

Vous avez une idée?
(sachant que quand je doublie clique sur l'erreur: la ligne en rouge est selectionnée)

Merci beaucoup.
Commenter la réponse de mikl31140
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
74
0
Merci
Bonjour,

Une requête INSERT basée sur un ordre SELECT ne se bati pas vraiment comme ça, mais plutot sous cette forme.

INSERT INTO [dbo].[TB_PRO_ACTIVITES_PROSPECT] (ACP_PROSPECT, ACP_ACTIVITES)
SELECT PRO_CLE, PRO_ACTIVITE
FROM TB_PRO_PROSPECTS
WHERE (PRO_ACTIVITE is not null)

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
28
0
Merci
Salut

Ta syntaxe est mauvaise.

Voici la syntaxe classique d'un insert :
insert into maTable (maCol1, maCol2) values (maVal1, maVal2);

Et celle d'un insert avec un select
insert into maTable1 (maCol1, maCol2) select maCol3, maCol4 from maTable2 where maCondition;

Donc en gros, tout ce que tu as à faire, c'est effacer le mot-clé values que tu ne dois mettre que pour précéder des valeurs que tu entres de façon manuelle (et non précéder les colonnes).

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
28
0
Merci
Désolé coq, j'avais pas réactualisé la page ;-)

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
74
0
Merci
Pas de problème :-)

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Messages postés
2
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
8 juin 2009
0
Merci
Exact! Merci bien, super la vitesse de réaction, c'est sympa :)
Commenter la réponse de mikl31140