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

Signaler
Messages postés
4
Date d'inscription
vendredi 10 avril 2009
Statut
Membre
Dernière intervention
18 mai 2009
-
mikl31140
Messages postés
2
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
8 juin 2009
-
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

Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
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
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
35
+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 ! -
Messages postés
2
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
8 juin 2009

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.
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
76
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
*/
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
35
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 ! -
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
35
Désolé coq, j'avais pas réactualisé la page ;-)

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

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
2
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
8 juin 2009

Exact! Merci bien, super la vitesse de réaction, c'est sympa :)