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

Entity Framework Discussion :

Afficher le retour d'une ProcStock dans un GridView


Sujet :

Entity Framework

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Points : 21
    Points
    21
    Par défaut Afficher le retour d'une ProcStock dans un GridView
    Salut à tous,

    Je cherche à faire une matrice des droits utilisateurs pour mon appli web (C#, .Net 4, Entity Framework Model First).

    Je stocke les informations de droits dans deux tables :
    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
    CREATE TABLE [dbo].[UserFieldVisibilitySet](
    	[UFV_Id] [int] IDENTITY(1,1) NOT NULL,
    	[UFV_FieldName] [nvarchar](max) NOT NULL,
    	[UFV_UserLevelId] [int] NULL,
    	[UFV_IsVisible] [bit] NULL,
     CONSTRAINT [PK_UserFieldVisibilitySet] PRIMARY KEY CLUSTERED 
    (
    	[UFV_Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[UserFieldVisibilitySet]  WITH CHECK ADD  CONSTRAINT [FK_UserLevelUserFieldVisibility] FOREIGN KEY([UFV_UserLevelId])
    REFERENCES [dbo].[UserLevelSet] ([UL_Id])
    GO
    ALTER TABLE [dbo].[UserFieldVisibilitySet] CHECK CONSTRAINT [FK_UserLevelUserFieldVisibility]
    GO
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE [dbo].[UserLevelSet](
    	[UL_Id] [int] IDENTITY(1,1) NOT NULL,
    	[UL_Name] [varchar](250) NOT NULL,
    	[UL_MinimalPoint] [int] NOT NULL,
     CONSTRAINT [PK_UserLevelSet] PRIMARY KEY CLUSTERED 
    (
    	[UL_Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
    UNIQUE NONCLUSTERED 
    (
    	[UL_Name] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    J'ai réalisé la requête suivante qui me retourne mes données comme je le souhaite :
    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
    declare @LevelName varchar(max)
    declare @DynamicStr nvarchar(max)
     
    select distinct UFV_FieldName into #tempFields from UserFieldVisibilitySet
    select distinct UL_Id, UL_Name into #tempLevel from UserLevelSet order by UL_Id
     
    while ((select count(*) from #tempLevel) > 0)
    begin
    	set @LevelName = (select top 1 UL_Name from #tempLevel)
    	set @DynamicStr = 'alter table #tempFields add [' + @LevelName + '] bit'
    	exec sp_executesql @DynamicStr
    	set @DynamicStr = 'update #tempFields set [' + @LevelName + '] = ' + '(select UFV_IsVisible from UserFieldVisibilitySet where UFV_FieldName = #tempFields.UFV_FieldName and UFV_UserLevelId = (select top 1 UL_Id from #tempLevel))'
    	exec sp_executesql @DynamicStr
    	delete from #tempLevel where UL_Name = @LevelName
    end
     
    select * from #tempFields
     
    drop table #tempFields
    drop table #tempLevel
    Cette requête me retourne le résultat suivant (la première colonne étant composée de string et les autres de booléens) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    UFV_FieldName		Penseur débutant	Penseur occasionnel	Penseur récurrent	Penseur de grand chemin
    U_BirthDate		0			0			1			1
    U_CountPoints		0			0			1			1
    U_Description		0			1			1			1
    U_Id			0			0			0			0
    U_Image			0			0			0			1
    U_IsActive		0			0			0			0
    U_LastConnection	0			0			0			1
    U_Mail			0			0			0			1
    U_Password		0			0			0			0
    U_RegisterDate		0			0			0			1
    U_UserLevelId		1			1			1			1
    U_UserName		1			1			1			1
    U_UserRightId		0			0			0			0
    Jusque là, tout va bien, j'ai tout ce qu'il me faut.
    Mon problème est pour ressortir tout ça au niveau de mon appli.

    Je pensais utiliser un gridview avec ma proc stock comme source de données.
    Le problème est qu'avec Entity (à moins que je n'ai loupé quelque chose), je dois indiquer le type de données qui m'est retourné.

    Je me suis donc dit que je pourrais me contenter de transcrire cette requête en Linq mais là, je cale...

    Comment alimenter mon gridview avec le résultat de cette requête ?
    OU
    Comment la transcrire en Linq ?

    Merci de votre aide.

    Max

  2. #2
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    J'ai peut être une piste mais : est-ce la solution ?

    J'ai créé deux types complexes :
    - "FieldVisiblityRight" qui se compose d'une propriété scalaire booléenne
    - "UserProfileRights" qui se compose d'une propriété scalaire de type string et d'une propriété complexe "FieldVisiblityRight"

    Pourquoi ça ?
    Parce que ma procédure stockée me retourne toujours une première colonne de type string et un nombre inconnu de colonne de type booléen (selon le nombre de profils utilisateurs existants).

    Via mon modèle, j'ai donc indiqué que la valeur de retour de ma PS était de type "UserProfileRights"

    Désormais, si je debug l'appel de ma procédure, je récupère bien le bon nombre d'items mais je n'accède pas au résultat qui m'est retourné si j'exécute ma PS depuis SSMS.

    Est-ce que je fais fausse route ?
    Est-ce que je peux ressortir le résultat de ma PS comme ça ?
    Est-ce que le fait d'avoir une requête dynamique dans ma PS pose un problème avec entity ?

    Bref, j'ai besoin d'aide...

    Merci à tous !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    J'ai essayé d'appeler ma procédure stockée "à l'ancienne", sans utiliser entity pour voir le résultat. Ben c'est pas fameux, j'ai peut être un autre problème en fait...

    Le code qui me permet d'appeler ma PS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SqlConnection oConnection = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=ThoughtReader-DEV;Integrated Security=True;");
    SqlCommand oCommand = new SqlCommand("GetUserProfileRights", oConnection);
    oCommand.CommandType = CommandType.StoredProcedure;
    oConnection.Open();
    SqlDataReader oReader = oCommand.ExecuteReader();
    oConnection.Close();
    Si je place un espion sur mon oReader, voilà les infos que j'ai :
    - FieldCount : 5 (j'ai donc à priori le bon retour pusique via SSMS, j'ai en effet 5 champs dans mon résultat)
    - HasRows : true (j'ai donc des données en retour)
    - Affichage des résultats : j'ai le bon nombre d'items mais je n'ai "rien" dedans

    Sans espion, si j'observe le contenu de mon objet oReader, j'ai les même informations sauf si j'actualise l'affichage des résultats : "L'énumération n'a généré aucun résultat"

    On va pas se le cacher, c'est évident que je m’emmêle les pinceaux quelque part. Mais où ??

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Bon, mon gridview me retourne correctement mes résultats si je fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DataSet dsFieldVisibility = new DataSet();
    using (SqlConnection oConnection = new SqlConnection(AppConfigManager.ReadSetting("ConnectionString")))
    {
        SqlCommand oCommand = new SqlCommand("GetUserProfileRights", oConnection);
        oCommand.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter oAdapter = new SqlDataAdapter(oCommand);
        oAdapter.Fill(dsFieldVisibility);
    }
    gvLevelManager.DataSource = dsFieldVisibility;
    gvLevelManager.DataBind();
    C'est déjà un bon début, me reste à faire en sorte que je puisse appeler du code au clic sur les checkbox qui représentent mes booléens. Mais ça, c'est un autre sujet.

    Ma question ici c'est : comment je peux faire pour faire la même chose avec Entity ?

  5. #5
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Je pense que tu avais bien fait de passer par la création d'un complex type. Tu peux définir un Complex Type dans Model Browser. Tu ajoutes ensuite les Scalar Property selon le jeux d'enregistrement que tu voudrais retourner. Soit MyUsersProfilesce type complexe.

    Tu peux ensuite utiliser l'assistant "Function Import" pour mapper par exemple la fonction UserProfileRights sur le complex type MyUsersProfiles.

    Tu pourras donc faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<MyUsersProfiles> userProfiles = context.UserProfileRights (parm1, param2).ToList();
    en supposant que ta fonction UserProfileRights accepete deux paramètres. Ainsi tu pourra binder ton résultat sur un datagridview.

    EDIT: Puisque tu es en ASP.NET, je pense que tu peux utiliser le complex type avec EntityDataSource. Comme cela, l'affichage dans le datagridview sera plus simple pour toi.
    N'oubliez pas le tag et

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Ma procédure stockée ne me retourne pas une structure fixe : si j'ai un type de profil utilisateur supplémentaire, j'airai une colonne en plus (et une ligne par champ que l'utilisateur peux ou non consulter).

    C'est là que je bloque (ou que je ne comprend pas comment ça marche).

    Ma PS me retourne donc une structure de table comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [UFV_FieldName] nvarchar(max) not null
    [UserProfile1] bit not null
    [UserProfile2] bit not null
    [UserProfile3] bit not null
    ...
    [UserProfileN] bit not null
    Mon type complexe pour valeur de retour doit avoir une propriété scalaire par colonne de donnée retournée. Non ?
    Donc comment faire pour mes N colonnes de booléens ?

    Je pensais m'en sortir avec un type complexe composé :
    - d'une scalaire "string"
    - d'un type complexe lui même composé de scalaires "bool"
    Mais là, je suis plus ou moins perdu...

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/06/2015, 12h05
  2. [DLL] Afficher le contenu d'une dll dans un Tpanel
    Par Fabs dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2007, 14h30
  3. Réponses: 2
    Dernier message: 27/12/2005, 20h09
  4. Réponses: 3
    Dernier message: 25/11/2005, 14h51
  5. Réponses: 29
    Dernier message: 03/11/2005, 10h37

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