Créer et lancer une requête SQL en C#

Messages postés
19
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008
- - Dernière réponse : marwa58
Messages postés
3
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
1 décembre 2010
- 5 juin 2010 à 03:29
Salut à tous :)

Alors voilà mon problème, je crois que j'ai à peu près réussi à lier ma BDD (SQL Server) à mon programme (Visual C# 2008 Express) avec ce code :

        IDbConnection dbconn = dbfactory.CreateConnection();
        dbconn.Open();
        IDbCommand dbcomm = dbconn.CreateCommand();
        dbcomm.Connection = dbconn;

Tout en mettant dans les usings :

        using System.Data.Common;
        using System.Configuration;

Voilà, déjà manque-t'il quelque chose?

Ensuite, j'ai réussi à enregistrer un nouveau film (vidéothèque :p) entré par l'utilisateur (Titre, durée, genre & avis) avec ce code :

         Film F1 = new Film(textBox1.Text, textBox2.Text, comboBox1.Text, comboBox2.Text);

Mais maintenant voilà, j'aimerais enregistrer ce film F1 dans ma table 'Film' de ma BDD. Comment faire? Requête SQL?
Le problème est que je ne sais pas comment et avec quoi créer et lancer ma requête.

Merci d'avance,
CleemS!
Afficher la suite 

13 réponses

Meilleure réponse
Messages postés
19
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008
5
3
Merci
Je te remercie beaucoup, sa me permet d'avancer ^^

Seulement voilà, mon programme n'apprécie pas trop certaines commandes apparemment, voici ton code que j'ai modifié :

            IDbCommand command = new IDbCommand();
            command.commandtext = "INSERT INTO Film(Titre, Duree, Genre, Avis, Affiche) VALUES('"+F1.GetTitre()+"','"+F1.GetDuree()+"','"+F1.GetGenre()+"','"+F1.GetAvis()+"','"+F1.GetAffiche()+"')";
            command = dbconn.CreateCommand();
            command.ExecuteNonQuerry();

Mais il y a des erreurs sur ce que j'ai souligné, pour la 1ère c'est : "Cannot create an instance of the abstract class or interface 'System.Data.IDbCommand'"...

Me manque des usings?

Dire « Merci » 3

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

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

Commenter la réponse de CleemS
Messages postés
100
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
18 février 2011
3
1
Merci
Salut,

Si je comprend bien film est le nom d'une classe que tu as créée. Ton constructeur doit être du style :

    private string m_nom_film;
    private string m_genre_film;
    private string m_auteur_film;

    public film(string nom_film, string genre_film, string auteur_film)
    {
       this.m_nom_film = nom_film;
       this.m_genre_film = genre_film;
       this.m_auteur_film = auteur_film;
    }
    // le faire 3 fois pour tous les membres privés => on aura nom, genre et auteur
    public string nom
   {
       Get{return this.m_nom_film;}
    }

Donc, si tu veux enregistrer ton film dans ta table, il te faudra faire une requête d'insertion. Ici je vais faire une requête INSERT dans un 'IDbCommand' avec ce que je pense être ton constructeur de ta classe film. Supposons aussi que les noms des colonnes de ta table 'Film' soient : nomdufilm, genredufilm et auteurdufilm, la requêtes sera du style :

IDbCommand command = new IDbCommand(); (je peux me tromper pour ca mais essaie)
command.commandtext = "INSERT INTO Film(nomdufilm,genredufilm,auteurdufilm) VALUES('"+F1.nom+"','"+F1.genre+"','"F1.auteur')";
command = dbconn.CreateCommand();
command.ExecuteNonQuerry();

Et voila, je pense que c'est à ca que ca doit ressembler, regarde si ca va correctement,  il y a peut-être quelques fautes car j'utilise une autre méthode un peu plus simple. Tu peux aussi utiliser des bloc Try Catch pour voir si il y a des erreurs et voir où sont les erreurs.

A+, bonne programmation,

Le Grand Jisay
Commenter la réponse de Le grand Jisay
Messages postés
19
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008
5
1
Merci
Re Jisay, merci beaucoup sa m'a bien fait avancer, mais sa me génère encore une petite erreur, sa doit venir de la propriété 'ConnectionString' de mon SqlConnection, je n'ai pas trop compris quoi mettre dans le champ, et quoique je mette il me dit :

"Format of the initialization string does not conform to specification starting at index 0."

Que faire?
Commenter la réponse de CleemS
Messages postés
100
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
18 février 2011
3
1
Merci
Oui, c'est un peu compliqué le format de ConnectionString.

Quand tu as ajouté ton SqlConnection à ta Form, dans la propriété ConnectionString, tu cliques bien sur la flèche tout à droite ? Là il faut choisir nouvelle connexion, puis parcourir et tu vas sur parcourir et tu vas chercher ta base de données SQL qui se trouve sur ton disque dur et normalement Visual Studio te génère tout seul comme un grand la ConnectionString.

Tu peux aussi ajouter ta base de données à ta solution. Je m'explique : dans ton explorateur de solution (sous Visual Studio) tu clique droit sur le nom de ton projet, ensuite Ajouter\Un élément existant et là tu vas chercher ta base de données SQL sur ton disque dur. Ensuite, si tu fais comme ca ou si c déjà comme ca que tu as procédé pour ta base de données, tu vas dans les propriétés de ta ConnectionString, clic sur la flèche à droite et au dessus de 'Nouvelle Connexion', tu choisis la base de données que tu as importée a ton projet.

Voila je pense avoir bien expliqué, je n'ai jamais eu cette erreur donc je ne sais pas trop si ca vient de la mais bon, ca c'est la bonne technique.

A+, Le Grand Jisay
Commenter la réponse de Le grand Jisay
Messages postés
19
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008
5
1
Merci
Je crois avoir résolu le problème, j'ai mis : "Data Source=C:\Program Files\Microsoft SQL Server\MSSQL\Data\DivX_Data.MDF" dans la ConnectionString, et il accepte ce type de ligne.

Malheureusement j'ai encore une erreur lors de l'ajout d'un Film : "There is a file sharing violation. A different process might be using
the file. [ C:\Program Files\Microsoft SQL
Server\MSSQL\Data\DivX_Data.MDF ]".

Etrange car à part SQL Server et mon programme, rien n'utilise ma BDD, et si je la désactive sa ne marche pas non plus... Etrange je ne comprends pas. =/
Commenter la réponse de CleemS
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
52
1
Merci
Hello,

Si tu travailles avec SQL server, c'est un peu différent d'un ficher Access, tu te connecte à la base de donnée, pas au fichier.

Pour les connectionsString, il y a un site excellent : http://www.connectionstrings.com/?carrier=sqlserver2005

Sans mot de passe (sécurité windows)

Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;

Avec mot de passe
Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;

De plus, faites attention tout les deux. UTILISEZ DES REQUÊTES PARAMÉTRÉES !!!!!C'est une question de sécurité, mais aussi de simplification de ton code.
La moitié des questions portant sur une requête qui marche mal vient de problème qui n'existerait pas si on utilise des requêtes paramétrées.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
100
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
18 février 2011
3
1
Merci
Salut SharpMao,

Je procède rarement avec des requêtes paramétrées, néanmoins je sais les utiliser. J'utilise de préférence les procédures stockées mais j'ai commencer par expliquer simplement les requêtes SQL à Cleems car apparement, il n'en a pas encore beaucoup fait.

A+,

Le Grand Jisay
Commenter la réponse de Le grand Jisay
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
52
1
Merci
Salut à toi aussi,

Quand je parle de requêtes paramétrées, j'inclue les procédures stockées.
Ce que je veux éviter, c'est de mettre des valeurs sous forme de string dans une requête, quel que soit le type de la requête.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
3
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
1 décembre 2010
1
1
Merci
slt
jé fé une application etudina jé fé la classe cnx et classe etudiant et le formulaire
quand je fai j'execute le prog il ya un erreur qui se produit quand je click sur le bouton ajouter
voila le code
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Data;
namespace WindowsApplication2
{
class etudiant
{
private int _matricule;
private string _nom;
private string _prenom;
private string _adresse;
private int _cin;

public etudiant(int matricule, string nom, string prenom, string adresse, int cin)
{
this._matricule = matricule;
this._nom = nom;
this._prenom = prenom;
this._adresse = adresse;
this._cin = cin;
}
public int matricule
{
get { return _matricule; }
set { _matricule = value; }

}
public string nom
{
get { return _nom; }
set { _nom = value; }
}
public string prenom
{
get { return _prenom; }
set { _prenom = value; }
}
public string adresse
{
get { return _adresse; }
set { _adresse = value; }
}
public int cin
{
get { return _cin; }
set { _cin = value; }
}
public void inserer()
{

string req = "insert into etudiant (matricule,nom,prenom,adresse,cin)values(" + _matricule + ",'" + _nom + "','" + _prenom + "','" + _adresse + "'," + _cin + ")";
OleDbCommand cmdaj = new OleDbCommand(req, connexion.cn);
cmdaj.ExecuteNonQuery();


}
public void supprimer()
{
string req "delete from etudiant where matricule" + _matricule;
OleDbCommand cmdsupp = new OleDbCommand(req, connexion.cn);
cmdsupp.ExecuteNonQuery();
}
public static DataTable recherche_nom(string nom)
{
DataTable dtcl = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter("select*from etudiant where nomcl like '" + nom + "%'", connexion.cn);
da.Fill(dtcl);
return dtcl;
}
public static DataTable recherche_num(int num)
{
DataTable dtcl = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter("select*from etudiant where matricule=" + num.ToString(), connexion.cn);
da.Fill(dtcl);
return dtcl;
}
public static DataTable charger_liste()
{
DataTable dtcl = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter("select*from etudiant", connexion.cn);
da.Fill(dtcl);
return dtcl;
}

public void maj()
{
string req = "update etudiant set nom='" + _nom + "',prenom='" + _prenom + "',adresse='" + _adresse + "',cin=" + _cin + " where matricule =" + _matricule;
OleDbCommand cmdmaj = new OleDbCommand(req, connexion.cn);
cmdmaj.ExecuteNonQuery();
}

}
}

un message s'affiche"l'exeption OleDbExeption n'a pas été gerer
merci
Commenter la réponse de marwa58
Messages postés
100
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
18 février 2011
3
0
Merci
Re,

Je ne vois pas trop, tu pourrais me dire avec quelle type de base de données tu travailles ? ACCESS, SQL, ORACLE,... ?
Et aussi avec quel logiciels tu programmes, Visual Studio je suppose, mais 2003 ou 2005 ?

Si tu travailles avec Visual Studio 2005, la manipulation de données est plus simple mais si tu es toujours en 2003, je t'expliquerai avec l'ancienne méthode...

A+,

Le Grand Jisay
Commenter la réponse de Le grand Jisay
Messages postés
19
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008
5
0
Merci
J'utilise SQL Server pour ma BDD, mais j'utilise Visual C# 2008 Express (j'ai pris la 1ère version gratuite que j'ai trouvé ^^).
Commenter la réponse de CleemS
Messages postés
100
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
18 février 2011
3
0
Merci
Ok ok je vois, j'avais oublié que cette version était sortie

Pour que ça soit plus simple, utilise l'espace de noms : System.Data.SqlClient
Maintenant pour ta requête, je te donne la marche a suivre :

- sur ta Form, tu ajoutes (à partir de la boite à outils) un objet de type SqlConnection (si c'est pas dans la boite à outils, tu ajoutes en cliquant droit dans la boite puis choisir les éléments). Tu modifies la propriété : 'ConnectionString' c'est-à-dire ta base de données Films. Ne change pas son nom, ça doit être SqlConnection1.
- tu ajoute de la même façon un objet de type sqlcommand. Tu modifies la propriété : Connection tu mets SqlConnection1. Ne change pas son nom non plus.
- Voila maintenant tu as créé tes objets pour pouvoir faire ta requête, maintenant dans ton code tu y places :

            try
            {
                this.sqlConnection1.Open();
                this.sqlCommand1.CommandText = "INSERT INTO Film(Titre, Duree, Genre, Avis, Affiche) VALUES('" + F1.GetTitre() + "','" + F1.GetDuree() + "','" + F1.GetGenre() + "','" + F1.GetAvis() + "','" + F1.GetAffiche() + "')";
                this.sqlCommand1.ExecuteNonQuery();
            }
            catch(SqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                this.sqlConnection1.Close();
            }

Voila, c'est la méthode qui nécessite le moins de ligne de code et je suppose qu'elle fonctionne aussi avec Visual Studio 2008.

A+, Le Grand Jisay
Commenter la réponse de Le grand Jisay
Messages postés
19
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
10 juin 2008
5
0
Merci
Je te remercie pour ces explications, mais je n'ai pas de petite flèche à droite de 'ConnectionString', j'ai bien ajouté ma BDD en cliquant droit sur mon projet > Add > Existing Item, je suis aller chercher ma BDD... Mais sa ne me fournit pas la ligne (ni la flèche pour chercher sa) a ma ConnectionString.

Cependant, sur mon SqlConnection1, je suis aller voir dans Application Settings > Property Bindings (là y'a trois petits points du genre parcourir) > ConnectionString (la revoilà :p). Là j'ai bien une petite flèche, mais quand je choisi "DivX_DataConnectionString" (DivX étant le nom de ma BDD) il me génère une erreur :

"Object of type 'Microsoft.VSDesigner.VSDesignerPackage.SerializableConnectionString' cannot be converted to type 'System.String'."

Donc je vois pas, car même en allant chercher le DataSet qu'il me propose, il veut pas...
Commenter la réponse de CleemS