Sébastien Pertus
Créer une classe d'accès aux données avec ADO.Net 2.0
Accès générique Ado.Net 2.0
Par Sébastien Pertus publié le 14/05/2006 à 22:34, lu 9902 fois, 7 pages
 6 | Génerique et generics
Téléchargez le code source - 60 Kb
Génerique et generics
Et oui, nous ne pouvions pas passer à coté de ce nouveau phénomène apporté par le framework 2.0 ! L'utilisation des generics !
Il parait évident que nous pouvons adapter notre classe pour pouvoir récupérer des collections génériques.
Mappage Collection – Procédure stockée
J'ai poussé un peu le vis à vouloir faire un mappage entre un objet unitaire et une procédure stockée.
Le principe est le suivant :
Marquer la classe comme étant mappé avec une procédure stockée. J'ai créé mon propre attribut et je l'ai affecté à ma classe, comme l'exemple suivant :
  [GenericAccess.AttributeSetExecuteOrder("Comunity_Select", true)]
    public class Community
    {

        private int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

}     
Une fois mon objet « marqué », je vais faire de même avec les propriétés, les associants aux champs renvoyés par ma procédure stockée :
  [GenericAccess.AttributeSetExecuteOrder("Comunity_Select", true)]
    public class Community
    {

        private int id;

        [GenericAccess.AttributeColumnName("cmt_intId")]
        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        private string name;

        [GenericAccess.AttributeColumnName("cmt_strName")]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

}     
Il ne reste plus qu'à compléter notre classe pour utiliser ce système
Récupération d'une liste de génériques
Le code de récupération d'une liste générique est assez simple, pour peu que vous soyez familier du concept des Generics. Je vous invite à lire les articles du site techHeadBrothers s'y rapportant, si vous avez besoin de plus de détails.
Dans notre cas, la procédure est compléter par le passage de paramètres pour se mapper à ceux de notre procédure stockée (le cas échéant)
/// <summary>
/// Remplit une collection gnrique de type T
/// </summary>
public System.Collections.Generic.List<T> GetList<T>(params Object[] parameters)
{

    // Dclaration d'une liste de T
    System.Collections.Generic.List<T> list = new List<T>();

    // Attributs de T
    AttributeSetExecuteOrder attribLocaux = null;
    // Attributs des membres de T
    ArrayList lstMembers = null;

    // Rcupration des attributs
    this.CaptureAttributes(typeof(T), out attribLocaux, out lstMembers);

    if (attribLocaux != null && attribLocaux.IsStoredProcedure && attribLocaux.SqlOrder != string.Empty)
    {
    // Rcupration du DataReader
    System.Data.Common.DbDataReader dr = this.GetReader(attribLocaux.SqlOrder, parameters);

    if (dr.HasRows)
        while (dr.Read())
        list.Add(this.PopulateObject<T>(dr, lstMembers));

    }

    return list;
}
Vous noterez l'appel à la fonction privée this.CaptureAttributes(typeof(T), out attribLocaux, out lstMembers). Cette fonction récupère les attributs des classes unitaires.
Remarquez le passage par référence des arguments attribLocaux et lstMembers, utile si l'on ne veut pas perdre les pointeurs en route ;-)
 
» Démarrer une discussion
 
Discussion démarée par hugues le 06/10/2008 à 13:56, 1 commentaire(s).
Discussion démarée par SonOfGod le 16/06/2009 à 11:57, 1 commentaire(s).