Insérer dans une base de donnée à partir d'une textBox [Résolu]

S1rK 17 Messages postés mardi 25 juillet 2006Date d'inscription 15 novembre 2011 Dernière intervention - 24 févr. 2010 à 09:44 - Dernière réponse : S1rK 17 Messages postés mardi 25 juillet 2006Date d'inscription 15 novembre 2011 Dernière intervention
- 24 févr. 2010 à 11:53
Bonjour à tous,

Débutant en C# et SQL, j'en appel a votre bon coeur. Voila mon problème:
Je souhaite, à partir d'une textBox, rentrer la valeur saisie dans ma bdd.

Après moultes recherches, j'ai trouvé mon bonheur, mais voila, lorsque j'exécute mon programme, celui-ci n'aime pas du tout cette partie "&textBox1.Text&", me prétextant ceci: "L'opérateur '&' ne peut pas être appliqué aux opérandes de type 'string' et 'string'"

try
{

SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = "***";
myConnection.Open();

SqlCommand myCommand = new SqlCommand();
myCommand.CommandText = ("INSERT INTO Produit (Nom) VALUES ('"&textBox1.Text&"') ");

myConnection.Close();

MessageBox.Show("Produit Ajouter", "OK");

}

catch (SqlException exp)
{
MessageBox.Show(exp.Message);
}

Si vous avez une petite idée, je suis plus que preneur =)
Merci d'avance!
Afficher la suite 

5 réponses

Répondre au sujet
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 24 févr. 2010 à 10:36
+2
Utile
Salut

En C#, le symbole de concaténation de chaines de caractère est +
myCommand.CommandText = "INSERT INTO Produit (Nom) VALUES ('" + textBox1.Text + "')";


Il ne faut pas non plus oublier d'exécuter ta requête.
myCommand.ExecuteNonQuery();

ExecuteNonQuery() permet d'exécuter une requête qui ne renvoie pas de résultat (INSERT, UPDATE, DELETE...)

L'autre solution consiste à utiliser des requêtes dites paramétrées.

myCommand.CommandText = "INSERT INTO Produit (Nom) VALUES (@NomProduit)";
myCommand.Parameters.Add(new SqlParameter("@NomProduit", textBox1.Text));
myCommand.ExecuteNonQuery();

C'est plus lisible, surtout dans les grandes requêtes.
C'est plus facile de mettre telle ou telle valeur selon une certaine condition.
Ça évite d'avoir à savoir comment on doit écrire la requête pour ce type de données (pas besoin de mettre ' autour d'un string par exemple).
Ça évite l'injection SQL.

PS : Je suppose que tu voulais écrire "Produit Ajouté" dans ta MessageBox, pas "Produit Ajouter".

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
S1rK 17 Messages postés mardi 25 juillet 2006Date d'inscription 15 novembre 2011 Dernière intervention - 24 févr. 2010 à 11:31
0
Utile
Salut, un grand merci a toi de te prendre la peine de m'expliquer aussi clairement, c'est vraiment très appréciable pour un néophyte comme moi =) Je commence justement a voir de plus près les requêtes paramétrés en ce moment, mais ne pensais pas en avoir l'utilité ici forcément.

Malgré tout, j'ai encore un petit souci, lors de l'exécution de mon programme, celui s'arrête justement sur la dite requête: "myCommand.ExecuteNonQuery();" avec comme justification "ExecuteNonQuery : la propriété Connection n'a pas été initialisée."

   
            SqlConnection myConnection = new SqlConnection();
            myConnection.ConnectionString = "server=***;user=***;password=***;initial catalog=***";
            myConnection.Open();
            try
            {
                SqlCommand myCommand = new SqlCommand();
                /* myCommand.CommandText = ("INSERT INTO Produit (Nom) VALUES ('"+textBox1.Text+"')"); */
                myCommand.CommandText = "INSERT INTO Produit (Nom) VALUES (@NomProduit)";
                myCommand.Parameters.Add(new SqlParameter("@NomProduit", textBox1.Text));

                myCommand.ExecuteNonQuery();

                MessageBox.Show("Produit Ajouté", "OK");

            }

            catch (SqlException exp)
            {
                MessageBox.Show(exp.Message);
            }

            finally
            {
                myConnection.Close();
            }


encore un grand merci à toi, et aux éventuelles autres personnes qui passeront ici =)
Commenter la réponse de S1rK
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 24 févr. 2010 à 11:39
0
Utile
C'est juste, je n'avais pas fait gaffe.

Tu as créé ta connexion, tu l'ouvres, tu la refermes à la fin, mais tu as oublié d'indiquer à ta commande quelle connexion utiliser.

myCommand.Connection = myConnection;


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 24 févr. 2010 à 11:47
0
Utile
En fait, l'exception parle d'elle même.

ligne : myCommand.ExecuteNonQuery();
"La propriété" => Une propriété est le nom donné à un accesseur en C#. Il s'agit d'un membre d'un objet. Or le seul objet sur la ligne générant l'exception est myCommand.
"La propriété Connection" => Bah, maintenant que tu sais de quel objet on parle, c'est très clair : myCommand.Connection
"n'a pas été initialisé" => Tu ne lui a pas donné de valeur.

Donc il fallait faire myCommand.Connection = uneValeur; avant le ExecuteNonQuery();

Bon, et là, je pense que c'est assez compréhensible que la valeur à mettre c'est myConnection dans ton cas.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
S1rK 17 Messages postés mardi 25 juillet 2006Date d'inscription 15 novembre 2011 Dernière intervention - 24 févr. 2010 à 11:53
0
Utile
Haaaaaaaaaa oui effectivement! j'ai totalement oublié de remettre cette commande dans tout mon bordel, tête en l'air que je suis!

J'ai encore un peu de mal avec les commandes SQL, sinon je pense que je me serai rapidement aperçu de mon oublie, mais je l'avoue, je n'ai pas cherché bien loin ^^

Ça fonctionne parfaitement, un énorme merci a toi encore une fois, tu m'a été d'une grande aide =)

Have a nice day!
Commenter la réponse de S1rK

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.