Debut de package pour accès base de données [Résolu]

Signaler
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Salut

voila je commence a faire un package pour l'accés à la base de données ...qu'en pensez vous ?
c juste un debut
je pense ensuite faire les ajout par SQL...

--------------------------------------------------------------------------------------------------------------------------------------
namespace Create_BD
{
    class DB_Type
    {
        static public String getBool() { return "BIT"; }
        static public String getShort() { return "SHORT"; }
    }

    class DB_Champ
    {
        private String Nom;
        private String Type;
        private int Size = 0;

        private bool Not_Null = false;
        private bool Unique = false;
        private bool Primary_Key = false;

        public DB_Champ(String theNom, String theType)
        {
            this.Nom = theNom;
            this.Type = theType;
        }

        public DB_Champ(String theNom, String theType, int theSize) : this(theNom, theType)
        {
            this.Size = theSize;
        }

        public DB_Champ(String theNom, String theType, int theSize, bool theNotNull)
            : this(theNom, theType, theSize)
        {
            this.Not_Null = theNotNull;
        }

        public DB_Champ(String theNom, String theType, int theSize, bool theNotNull,
            bool theUnique) : this(theNom, theType, theSize, theNotNull)
        {
            this.Unique = theUnique;
        }

        public DB_Champ(String theNom, String theType, int theSize, bool theNotNull,
            bool theUnique, bool thePrimary_Key) : this(theNom, theType, theSize, theNotNull, theUnique)
        {
            this.Primary_Key = thePrimary_Key;
        }

        public void Clear()
        {
            this.Nom = "";
            this.Type = "";
            this.Size = 0;
            this.Not_Null = false;
            this.Unique = false;
            this.Primary_Key = false;
        }

        public void setNom(String theNom) {this.Nom = theNom;}
        public void setType(String theType) {this.Type = theType;}
        public void setSize(int theSize) {this.Size = theSize;}
        public void setNotNull(bool theNotNull) {this.Not_Null = theNotNull;}
        public void setUnique(bool theUnique) {this.Unique = theUnique;}
        public void setPrimaryKey(bool thePrimaryKey) {this.Primary_Key = thePrimaryKey;}

        public String getNom() { return this.Nom; }
        public String getType() { return this.Type; }
        public int getSize() { return this.Size; }
        public bool getNotNull() { return this.Not_Null; }
        public bool getUnique() { return this.Unique; }
        public bool getPrimaryKey() { return this.Primary_Key; }

        public void toConsole()
        {
            Console.WriteLine("  -> " + this.Nom + "  " + this.Type + "  " + this.Size +
                "  NotNull:" + this.Not_Null + " Unique:" + this.Unique +
                " PrimaryKey:" + this.Primary_Key);
        }
    }

    class DB_Table
    {
        private String Nom;
        private ArrayList ListeChamp;

        public DB_Table()
        {
            this.ListeChamp = new ArrayList();
        }

        public void setNom(String theNom) {this.Nom = theNom;}
        public String getNom() {return this.Nom;}

        public bool Add(DB_Champ theChamp)
        {
            for (int i = 0; i < this.ListeChamp.Count; i++)
            {
                if (((DB_Champ)this.ListeChamp[i]).getNom() == theChamp.getNom())
                    return false;
            }

            ListeChamp.Add(theChamp);
            return true;
        }

        public void toConsole()
        {
            Console.WriteLine("------------------------------------------------------------------");
            Console.WriteLine(this.Nom);
            for (int i = 0; i < this.ListeChamp.Count; i++)
            {
                ((DB_Champ)this.ListeChamp[i]).toConsole();
            }
            Console.WriteLine("------------------------------------------------------------------");
        }
    }

    class Create_DB
    {       
        private String DBPath;
        private ArrayList ListTable;
       
        public String getDBPath()
        {
            return this.DBPath;
        }

        public void setDBPath(String theDBPath)
        {
            this.DBPath = theDBPath;
           
        }

        public void AddTable(DB_Table theTable)
        {
            this.ListTable.Add(theTable);
        }

        public Create_DB() {
            this.DBPath = "";
            this.ListTable = new ArrayList();
        }
    }
}
--------------------------------------------------------------------------------------------------------------------------------------

Herve

34 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
Voui, suffit de précéder la méthode, class, ou autre par "///"
Liste complète http://perso.orange.fr/jm.doudoux/microsoft/doctechcsharp/doctechcsharp.htm

<hr size="2" />VC# forever
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Salut,

j'ai parcouru en diagonale, premiere remarque que j'ai a faire, c'est qu'en C# on utilises le camelCasing pour les champs et on utilise des propriétés, et non pas des accesseurs.

Par exemple, ton champ privé "Nom" devient "nom"
et tu remplaces

public void setNom(String theNom) {this.Nom = theNom;} et
public String getNom() { return this.Nom; }

par

public string Nom
{
   get { return this.nom; }
   set { this.nom = value;}
}

tu peux tout a fait omettre le set ou le get, ou leur rajouter du code

Mx
MVP C# 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
Et j'ajouterais qu'il y a déjà des tonnes de sources sur ce sujet sur le site.... De quoi t'en inspirer.

<hr size="2" />VC# forever
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Seconde remarque, si tu bosses en .Net 2, n'utilises pas un ArrayList, mais une List<DB_Champ>;
Autrement, plutot que d'avoir ca :

        public bool Add(DB_Champ theChamp)
        {
            for (int i = 0; i < this.ListeChamp.Count; i++)
            {
                if (((DB_Champ)this.ListeChamp[i]).getNom() == theChamp.getNom())
                    return false;
            }

            ListeChamp.Add(theChamp);
            return true;
        }

J'opterais plutot pour :
<hr />public
bool Add(
DB_Champ theChamp)
{

   if (ListeChamp.Contains(theChamp))
return
false;
   ListeChamp.Add(theChamp);
   return true;
}

<hr />
En ajoutant ces méthodes a ta classe DB_Champ :
<hr />public
override
string ToString()
{

   return
this.Nom;
}

public
override
int GetHashCode()
{

   return
this.Nom.ToLowerInvariant().GetHashCode();
}

public
override
bool Equals(
object obj)
{

   DB_Class t = obj
as
DB_Class;

   return t.Nom ==
this.Nom;
}
<hr />

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ouah merci !!!

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Juste une question concernant cela :

public string Nom
{
   get { return this.nom; }
   set { this.nom = value;}
}

la declaration de la variable c bien : public string Nom
On appel comment les fonction getNom ?

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
les fonctions getNom et setNom deviennent Nom
en fait tu as :
private string nom;
public string Nom
{
   get { return this.nom;}
   set { this.nom = value;}
}

et tu les appeles ainsi :
tonObjet.Nom = "aaa"; // ce qui te servait de setNom
string leNom = tonObjet.Nom; // ce qui te servait de getNom

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ah ok ...

mais cela marche aussi en mettant string "leNom = tonObjet.getNom();" pour le get ?
et si j'ai bien compris si je rajoute une fonction Toto j'aurais une fonction "TotoNom".....???

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Il n'y a plus de setNom ni de getNom.

C'est la propriété Nom, qui fait exactement la meme chose que ton setNom et getNom, qui les remplace.

Donc je répète avec de la couleur pour que ce soit plus clair ;)
<hr />private
string nom;
// Champ privé nom

public
string Nom
{

   get {
return
this.nom; }
// Agit comme getNom();
   set {
this.nom =
value; }
// Agie comme setNom(string theNom);
}
<hr />

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

D'accord ...en fait cela permet de modifier la variable private en passant par set et get comme si elle etait en public ...
Sinon c normal qu'il n y ait pas d'espace "publicstring Nom" ?

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Voila, c'est exactement ca.

Pour les espaces c'est pas normal, ils ont été mangé sur tout le post
il faut en rajouter partout ou il en manque ;)

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ok

Une chose encore ...cela sert a quoi override ? si j'ai bien compris il faut mettre override pour definir une fonction qui est presente dans la classe abstraite dont l'objet est herité ?

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Voila, le mot clé override permet de reimplémenter un membre hérité d'une classe.
Dans ton cas, il s'agit de redefinir les méthodes de la classe Object (qui n'est pas abstraite)

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Merci !

Sinon au niveau de la structure de mon package est ce que cela semble "bien" ?

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Je ne trouve rien concernant l'objet List ?
faut il inclure qqchose ?

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Salut, il s'agit d'une classe generique du framework .Net 2, et il faut ajouter l'espace de nom System.Collection.Generics pour pouvoir l'utiliser.


Si tu bosses en .Net 1, alors tu dois rester avec un ArrayList.





Mx
MVP C#
 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Thx
je travaille avec .net 2 ...
je suis sous Microsoft Visual C# Express

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Dans cette fonction :

public override bool Equals(object obj)
        {
           DB_Champ t = obj as DB_Champ;
           return t.Nom == this.nom;
        }

pourquoi ne pas passer directement un objet de type DB_Champ ....
Et "DB_Champ t = obj as DB_Champ;"  correspond bien à cela

DB_Champ t = (DB_Champ)obj;

on fait bien un cast ?

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
La méthode Equals prend en parametre object.
Sinon, oui, as effectue bien un cast, sauf si tu ne passe pas un DB_Champ en parametre, ce qui alors renverra null.
Il faut d'ailleurs controler si l'instance  de DB_Champ que j'ai nommée 't' n'est pas null, ce que j'ai oublier de faire dans le code ;)

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

donc comme cela :

public override bool Equals(object obj)
        {
           DB_Champ t = obj as DB_Champ;
           if (t !=  null)
            return t.Nom == this.nom;
        }

Est ce que avec ton systeme de list est il possible de connaitre "rapidement" le nom (d'un element) a true sans pour autant parcourir la liste ?

Herve