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 49
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 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
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 49
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 49
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 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
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
Rejoignez-nous