none
Votre avis sur l'utilisation de Class RRS feed

  • Question

  • Bonjour,

    je voudrais avoir l'avis d'expert sur mon utilisation de Class pour un site Web.

    J'ai fais une petite page pour tester.

    J'ai une base de données avec une tables Ouvrages. J'ai créé une class Books.

    Sur mapage, j'ai une DropDownList qui charge 2 colonnes de ma table ouvrages. Pour cela, j'ai instancié un objet book de Type Books.

    Toujours sur cette même page, j'ai un formulaire qui me permet d'enregistrer un nouveau livre dans ma BD.

     

    Mes Questions sont les suivantes :

    1- Est-ce que créer une class Books vaut la peine?

    2- Est-ce que mon utilisation de la Class est la bonne?

    3- Est-ce que cela vaut la peine d'instancier un objet aussi bien pour charger mes données de ma BD que pour enregistrer mes nouveaux livres dans ma BD?

     

    Bref, j'ai besoin de vos avis et de vos conseils.

     

    Merci à tous et voici mon code :

    1- Ma Class Book

    public class Book
    {
        private string bookTitle;
        private string isbn;
        private string auteur;
        private int categorie;
        private decimal prix;
        private int CD;
        private DateTime dateParution;
        private int nbPages;
    
        // Constructeur
        public Book(string bookTitle, string isbn)
        {
            this.bookTitle = bookTitle;
            this.isbn = isbn;
        }
    
        public Book(string isbn, string bookTitle, string auteur, int categorie, decimal prix, int CD, DateTime dateParution, int nbPages )
        {
            this.isbn = isbn;
            this.bookTitle = bookTitle;
            this.auteur = auteur;
            this.categorie = categorie;
            this.prix = prix;
            this.CD = CD;
            this.dateParution = dateParution;
            this.nbPages = nbPages;
        }
    
    
        public string BookTitle { get { return this.bookTitle; } }
    
        public string Isbn { get { return this.isbn; } }
    
        public string Auteur { get { return this.auteur; } }
    
        public int Categorie { get { return this.categorie; } }
    
        public decimal Prix { get { return this.prix; } }
    
        public int Cd { get { return this.CD; } }
    
        public DateTime DateParution { get { return this.dateParution; } }
    
        public int NbPages { get { return this.nbPages; }}
    }
    


    2- le traitement

     

    public partial class _Default : System.Web.UI.Page
    {
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == false)
            {
                ChargerListe();
            } 
        }
    
    
        void ChargerListe()
        {
                SqlConnection myConnection = new SqlConnection();
    
       
            myConnection.ConnectionString = "Data Source=PC-LAURENCE\\SQLEXPRESS; Initial Catalog=Librarie; Integrated Security=True;";
            myConnection.Open();
    
            // Requete SQL
            SqlCommand myCommande;
            myCommande = new SqlCommand("SELECT Titre, ISBN from Ouvrages", myConnection);
            SqlDataReader lecteur = myCommande.ExecuteReader();
    
          
            List<Book> books = new List<Book>();
            while (lecteur.Read())
            {
                books.Add(new Book(lecteur["Titre"].ToString(), lecteur["ISBN"].ToString()));
            }
            DdlBooks.DataSource = books;
            DdlBooks.DataTextField = "BookTitle";
            DdlBooks.DataValueField = "Isbn";
            DdlBooks.DataBind();
    
            lecteur.Close();
            myConnection.Close();
        }
    
    
        protected void DdlBooks_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DdlBooks.SelectedIndex > -1)
            {
                LbBook.Text = DdlBooks.SelectedItem.Text;
                LbIsbn.Text = DdlBooks.SelectedValue;
            }
        }
        protected void Confirmer_Click(object sender, EventArgs e)
        {
            // Instatiation de l'objet Book
    
            Book NewBook = new Book(TxtIsbn.Text, TxtTitre.Text, TxtAuteur.Text, int.Parse(TxtCategorie.Text), decimal.Parse(TxtPrix.Text), int.Parse(TxtCD.Text), DateTime.Parse(TxtParution.Text), int.Parse(TxtPage.Text));
    
            if (Page.IsValid)
            {
                // Connexion à la DB
                // 1° Declaration de l'Objet connexion et création de l'objet
                SqlConnection myConnection = new SqlConnection();
    
                // 2° Ecriture de la chaine de connexion
                myConnection.ConnectionString = "Data Source=PC-LAURENCE\\SQLEXPRESS; Initial Catalog=Librarie; Integrated Security=True;";
                myConnection.Open();
    
                // Requete SQL
                SqlCommand myCommande;
                myCommande = new SqlCommand("Insert INTO Ouvrages (ISBN, Titre, Auteur, Catégorie, Prix, CD, DateParution, NbPages) VALUES('" + TxtIsbn.Text + "', '" + TxtTitre.Text + "', '" + TxtAuteur.Text + "','" + int.Parse(TxtCategorie.Text) +"','"+ decimal.Parse(TxtPrix.Text) +"', '"+ int.Parse(TxtCD.Text) +"', '"+ DateTime.Parse(TxtParution.Text) +"', '"+ int.Parse(TxtPage.Text) +"')", myConnection);
                myCommande.ExecuteReader();
    
            }
    
        }
    }
    


     

     

     

     

    vendredi 6 janvier 2012 12:43

Réponses

  • Bonjour,

    le choix de créer une classe pour représenter les entités de la base de données que vous manipulez est une bonne idée et une pratique très répandue via les outils dit de "mapping objet relationnel".  Dans votre cas vous avez créé votre objet Book que vous avez mappé sur la table Ouvrage au sein de la méthode ChargezListe : l'interet est donc que vous ne manipuliez dans votre page uniquement vos objets ( dits objets métier ) et que vous n'êtes plus lié à la structure de stockage de vos données.

    Dans ce but il pourrait être utile par la suite de placer votre méthode ChargezListe dans une classe dédiée aux opérations sur le base de données pour votre objet Book. Cette classe constituera une première classe de votre couche d'accès aux données ( dite DAL pour Data Access Layer ). En poussant l'exercice un plus loin vous pourrez rajouter une couche supplémentaire dite de service pour séparer votre application en 3 couches distinctes. Vous trouverez de très très nombreux exemples mettant en oeuvre différents outils ou technos ( voir le site pattern and practice de microsoft par exemple ou code project thre layer architecture )

    Au final pour une page de test votre approche et l'utilisation des classes est tout à fait correcte. 

    Sur la forme :

    - placer votre chaine de connection dans le fichier de configuration (web.config)

    - utilisez le mot clé using pour gérer le dispose de vos connexions à la base de donnée

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
    ...
    }
    
    

    Cordialement
    vendredi 6 janvier 2012 15:11
    Modérateur
  • Bonjour,

    lorsque vous utilisez le mot clé using(){ .. } les accolades délimite la portion de code dans lequel vous pourrez utilisez la variable. Dès que vous sortez de ce bloc la méthode dispose est appelé automatiquement ( vous n'avez pas besoin de faire appel à la méthode .Close() car .Dispose() appele déjà Close() ).

    Sauf besoin spécifique vous n'avez pas à tester l'état de la connexion, ouvrez là et fermez là dès que besoin : le pool de connexion à la base est là pour améliorer les performances sur ce sujet.

    void ChargerListeBook()
    {
      string connectionString = ConfigurationManager.ConnectionStrings["Ouvrages"].ConnectionString;
    
      using (SqlConnection myConnection = new SqlConnection(connectionString))
      {
        // Requete SQL
        SqlCommand myCommande = new SqlCommand("SELECT Titre, ISBN from Ouvrages", myConnection);
    
        // ouverture
        myConnection.Open();
    
        using (SqlDataReader lecteur = myCommande.ExecuteReader())
        {
          // Déclaration d'une liste books de Type Book
          List<Book> books = new List<Book>();
    
          while (lecteur.Read())
          {
            books.Add(new Book(lecteur["Titre"].ToString(), lecteur["ISBN"].ToString()));
          }
    
          DdlBooks.DataSource = books;
          DdlBooks.DataTextField = "BookTitle";
          DdlBooks.DataValueField = "Isbn";
          DdlBooks.DataBind();
        }
    
      }
    }
    
    

    Cordialement

    • Marqué comme réponse paintbox00 lundi 9 janvier 2012 14:05
    lundi 9 janvier 2012 09:31
    Modérateur
  • Essayer sans doubler le \  pour l'attibrut datasource, ce n'est pas utile dans un xml soit : PC-LAURENCE\SQLEXPRESS;

    Essayer éventuellement aussi sans préciser User Instance.

    Cordialement

    • Marqué comme réponse paintbox00 lundi 9 janvier 2012 14:05
    lundi 9 janvier 2012 14:02
    Modérateur

Toutes les réponses

  • Bonjour,

    le choix de créer une classe pour représenter les entités de la base de données que vous manipulez est une bonne idée et une pratique très répandue via les outils dit de "mapping objet relationnel".  Dans votre cas vous avez créé votre objet Book que vous avez mappé sur la table Ouvrage au sein de la méthode ChargezListe : l'interet est donc que vous ne manipuliez dans votre page uniquement vos objets ( dits objets métier ) et que vous n'êtes plus lié à la structure de stockage de vos données.

    Dans ce but il pourrait être utile par la suite de placer votre méthode ChargezListe dans une classe dédiée aux opérations sur le base de données pour votre objet Book. Cette classe constituera une première classe de votre couche d'accès aux données ( dite DAL pour Data Access Layer ). En poussant l'exercice un plus loin vous pourrez rajouter une couche supplémentaire dite de service pour séparer votre application en 3 couches distinctes. Vous trouverez de très très nombreux exemples mettant en oeuvre différents outils ou technos ( voir le site pattern and practice de microsoft par exemple ou code project thre layer architecture )

    Au final pour une page de test votre approche et l'utilisation des classes est tout à fait correcte. 

    Sur la forme :

    - placer votre chaine de connection dans le fichier de configuration (web.config)

    - utilisez le mot clé using pour gérer le dispose de vos connexions à la base de donnée

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
    ...
    }
    
    

    Cordialement
    vendredi 6 janvier 2012 15:11
    Modérateur
  • Bonjour,

     

    Merci Nikho pour votre avis. Cela me rassure un peu je suis dans le bon. J'ai bien noté vos liens je vais y jeter un oeil.

    J'ai essayé de placer ma  chaine de connection dans le fichier de configuration (web.config).

    Comme ceci

      <connectionStrings>
        <add
          name="Ouvrages"
          connectionString="data source=PC-LAURENCE\\SQLEXPRESS;
          Integrated Security=True;Initial Catalog=Librarie;User Instance=true"
          providerName="System.Data.SqlClient"
       /> 
      </connectionStrings>
    
    

    Par contre, je n'arrive pas à "l'appeler" dans mon code. J'ai essayé ceci :

            using (SqlConnection myConnection = new SqlConnection(Ouvrages))
    
    


    Mais cela ne fonctionne pas. Pourriez-vous m'indiquer la bonne façon de faire?

     

    Merci encore

     

     

    vendredi 6 janvier 2012 22:05
  • Bonjour,

    Il faut récupérer le chaîne de connexion via ce code :

    ConfigurationManager.ConnectionStrings["Ouvrages"].ConnectionString
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 8 janvier 2012 12:28
    Modérateur
  • Bonjour merci pour votre aide.

     

    Je patauge un peu. J'aurais besoin de votre aide.

     

    j'ai créé ma class dbConnection qui est la suivante : 

    public class dbConnection
    {
        private SqlDataReader myReader;
        private SqlConnection conn;
    
        /// <constructor>
        /// Initialise Connection
        /// </constructor>
    	public dbConnection()
    	{
            myReader = new SqlDataReader();
            conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Ouvrages"].ConnectionString);
    	}
    
        /// <method>
        /// Open Database Connection if Closed or Broken
        /// </method>
        private SqlConnection openConnection()
        {
            if (conn.State == ConnectionState.Closed || conn.State ==
                        ConnectionState.Broken)
            {
                conn.Open();
            }
            return conn;
        }
    }
    

    mais je ne vois toujours pas comment gérer la connexion dans mon code. J'ai recherché sur le net mais sans succès.

    J'ai testé ceci mais cela ne fonctionne pas. Auriez-vous une piste ?

     

        void ChargerListeBook()
        {
              using (SqlConnection myConnection = new SqlConnection(connectionString)) ;
     
            ConfigurationManager.ConnectionStrings["Ouvrages"].ConnectionString;
    
            // Requete SQL
            SqlCommand myCommande;
            myCommande = new SqlCommand("SELECT Titre, ISBN from Ouvrages", myConnection);
            SqlDataReader lecteur = myCommande.ExecuteReader();
    
            // Déclaration d'une liste books de Type Book
            List<Book> books = new List<Book>();
            while (lecteur.Read())
            {
                books.Add(new Book(lecteur["Titre"].ToString(), lecteur["ISBN"].ToString()));
            }
            DdlBooks.DataSource = books;
            DdlBooks.DataTextField = "BookTitle";
            DdlBooks.DataValueField = "Isbn";
            DdlBooks.DataBind();
    
            lecteur.Close();
            myConnection.Close();
        }
    
    

    Merci pour votre aide.

     

    dimanche 8 janvier 2012 19:46
  • Bonjour, Paintbox00,

     

    Pouvez-vous svp nous préciser quel est le comportement de votre programme (qu’est-ce qu’il ne fonctionne pas) ?  Avez-vous un message d’erreur ?

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 9 janvier 2012 08:00
  • Bonjour,

    lorsque vous utilisez le mot clé using(){ .. } les accolades délimite la portion de code dans lequel vous pourrez utilisez la variable. Dès que vous sortez de ce bloc la méthode dispose est appelé automatiquement ( vous n'avez pas besoin de faire appel à la méthode .Close() car .Dispose() appele déjà Close() ).

    Sauf besoin spécifique vous n'avez pas à tester l'état de la connexion, ouvrez là et fermez là dès que besoin : le pool de connexion à la base est là pour améliorer les performances sur ce sujet.

    void ChargerListeBook()
    {
      string connectionString = ConfigurationManager.ConnectionStrings["Ouvrages"].ConnectionString;
    
      using (SqlConnection myConnection = new SqlConnection(connectionString))
      {
        // Requete SQL
        SqlCommand myCommande = new SqlCommand("SELECT Titre, ISBN from Ouvrages", myConnection);
    
        // ouverture
        myConnection.Open();
    
        using (SqlDataReader lecteur = myCommande.ExecuteReader())
        {
          // Déclaration d'une liste books de Type Book
          List<Book> books = new List<Book>();
    
          while (lecteur.Read())
          {
            books.Add(new Book(lecteur["Titre"].ToString(), lecteur["ISBN"].ToString()));
          }
    
          DdlBooks.DataSource = books;
          DdlBooks.DataTextField = "BookTitle";
          DdlBooks.DataValueField = "Isbn";
          DdlBooks.DataBind();
        }
    
      }
    }
    
    

    Cordialement

    • Marqué comme réponse paintbox00 lundi 9 janvier 2012 14:05
    lundi 9 janvier 2012 09:31
    Modérateur
  • Bonjour merci à tous pour votre aide,

    j'ai repris le code proposé par Nikho. Et j'ai une erreur sur myConnection.Open(). Il me met " Echec d'instance". Je suppose que c'est une erreur dans mon connectionStrings de mon fichier Web.config?

    J'ai mis ceci mais je ne vois pas où serait l'erreur ?

      <connectionStrings>
        <add
          name="Ouvrages"
          connectionString="data source=PC-LAURENCE\\SQLEXPRESS;
          Integrated Security=True;Initial Catalog=Librarie;User Instance=true"
          providerName="System.Data.SqlClient"/>
      </connectionStrings>
    
    


    Merci


    lundi 9 janvier 2012 13:08
  • Essayer sans doubler le \  pour l'attibrut datasource, ce n'est pas utile dans un xml soit : PC-LAURENCE\SQLEXPRESS;

    Essayer éventuellement aussi sans préciser User Instance.

    Cordialement

    • Marqué comme réponse paintbox00 lundi 9 janvier 2012 14:05
    lundi 9 janvier 2012 14:02
    Modérateur
  • Ok cela fonctionne sans le User instance et sans le \.

    Encore merci

    lundi 9 janvier 2012 14:05