IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

SelectCommand avec variable globale


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut SelectCommand avec variable globale
    Bonjour,

    j'ai défini des variables globales dans mon global.asax et je voudrais pouvoir les référencer directement dans mon selectcommand à partir de la fenêtre des propriétés de mon datasource (sans passer par un évènement page_load)

    Quelquechose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <asp:SqlDataSource runat="server" 
      ConnectionString="xxxx" 
      SelectCommand="SELECT champ1, champ2 FROM Table1 WHERE Id = Application["glob_var]" />
    Cela est-il possible ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,
    sans passer par un évènement page_load
    Peux-tu nous dire pourquoi?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En fait, il existe des classes SessionParameter, CookieParameter, ControlParameter, etc... mais pas de ApplicationParameter.

    Donc je vois 2 solutions :

    - une facile, mais pas super confortable : tu déclares un simple Parameter dans ta SqlDataSource, et tu utilises l'évènement Selecting pour renseigner sa valeur en temps utile :
    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <asp:SqlDataSource runat="server" Id="sqlDataSource1"
            ConnectionString="xxxx"
            SelectCommand="SELECT champ1, champ2 FROM Table1 WHERE Id = @glob_var"
            OnSelecting="sqlDataSource1_Selecting">
        <SelectParameters>
            <Parameter Name="glob_var" DbType="Int32"/>
        </SelectParameters>
    </asp:SqlDataSource>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void sqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        e.Command.Parameters["glob_var"] = Application["glob_var"];
    }
    - une plus compliquée, mais plus simple à utiliser une fois que c'est fait (et réutilisable) : implémenter toi-même un ApplicationParameter... A priori c'est pas très difficile, il suffit d'overrider la méthode protégée Evaluate (et de créer quelques constructeurs pour rester conforme aux autres *Parameter) et la méthode Clone. Le plus simple est de regarder avec Reflector le code de SessionParameter et de s'en inspirer (en gros il devrait suffire de remplacer Session par Application, à peu de choses près...)
    Ensuite, dans le code ASPX, il suffit de faire ça :
    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <asp:SqlDataSource runat="server" Id="sqlDataSource1"
            ConnectionString="xxxx"
            SelectCommand="SELECT champ1, champ2 FROM Table1 WHERE Id = @glob_var">
        <SelectParameters>
            <custom:ApplicationParameter Name="glob_var" ApplicationField="glob_var" DbType="Int32"/>
        </SelectParameters>
    </asp:SqlDataSource>
    Par contre, mes connaissances en ASP.NET étant un peu limitées, j'ai juste un doute sur la possibilité d'utiliser dans le markup ASPX des types personnalisés autres que des contrôles... mais a priori je dirais que c'est possible. A tester, donc...

  4. #4
    Membre régulier
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut
    Merci pour vos réponses.

    En attendant j'ai utilisé effectivement l'événement selecting de mon datasource. L'idéal serait de developper un custom parameter mais le temps manquant ...

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Bibbox Voir le message
    L'idéal serait de developper un custom parameter mais le temps manquant ...
    Y a pas besoin de beaucoup de temps... 2 minutes environ
    J'ai directement copié le code de SessionParameter à partir de Reflector, et remplacé Session par Application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    [DefaultProperty("ApplicationField"), AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
    public class ApplicationParameter : Parameter
    {
        public ApplicationParameter()
        {
        }
     
        protected ApplicationParameter(ApplicationParameter original) : base(original)
        {
            this.ApplicationField = original.ApplicationField;
        }
     
        public ApplicationParameter(string name, string applicationField) : base(name)
        {
            this.ApplicationField = applicationField;
        }
     
        public ApplicationParameter(string name, DbType dbType, string applicationField) : base(name, dbType)
        {
            this.ApplicationField = applicationField;
        }
     
        public ApplicationParameter(string name, TypeCode type, string applicationField) : base(name, type)
        {
            this.ApplicationField = applicationField;
        }
     
        protected override Parameter Clone()
        {
            return new ApplicationParameter(this);
        }
     
        protected override object Evaluate(HttpContext context, Control control)
        {
            if ((context != null) && (context.Application != null))
            {
                return context.Application[this.ApplicationField];
            }
            return null;
        }
     
        [DefaultValue("")]
        public string ApplicationField
        {
            get
            {
                object obj2 = base.ViewState["ApplicationField"];
                if (obj2 == null)
                {
                    return string.Empty;
                }
                return (string) obj2;
            }
            set
            {
                if (this.ApplicationField != value)
                {
                    base.ViewState["ApplicationField"] = value;
                    base.OnParameterChanged();
                }
            }
        }
    }
    EDIT: Je viens de le tester, ça marcher nickel
    Il faut juste penser à ajouter un directive <%@ Register %> dans la page pour déclarer le namespace

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec Variable globale
    Par fabrizti dans le forum ActionScript 3
    Réponses: 8
    Dernier message: 11/05/2009, 17h17
  2. [CS3-AS3] Pb avec variable globale.
    Par iceman2001 dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 24/09/2008, 12h16
  3. problème avec variables globales
    Par johnburton54 dans le forum VBA Access
    Réponses: 5
    Dernier message: 12/06/2007, 09h20
  4. Réponses: 4
    Dernier message: 04/02/2007, 19h39
  5. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo