C# / SQL SERVEUR / Requete insert

Résolu
MBDA
Messages postés
4
Date d'inscription
vendredi 10 avril 2009
Statut
Membre
Dernière intervention
18 mai 2009
- 18 mai 2009 à 15:55
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

8 réponses

ed73
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
18 mai 2009 à 16:15
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
3
krimog
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
51
18 mai 2009 à 17:44
+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 ! -
3
mikl31140
Messages postés
2
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
8 juin 2009

8 juin 2009 à 11:43
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.
0
cs_coq
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
8 juin 2009 à 11:57
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
*/
0

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

Posez votre question
krimog
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
51
8 juin 2009 à 12:05
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 ! -
0
krimog
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
51
8 juin 2009 à 12:07
Désolé coq, j'avais pas réactualisé la page ;-)

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
cs_coq
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
8 juin 2009 à 12:11
Pas de problème :-)

/*
coq
MVP Visual C#
CoqBlog
*/
0
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
Exact! Merci bien, super la vitesse de réaction, c'est sympa :)
0