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 MVC Discussion :

[EF 4.1] Création d'une connectionString dynamiquement


Sujet :

ASP.NET MVC

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut [EF 4.1] Création d'une connectionString dynamiquement
    Bien le bonjour à tous

    Cela fait quelques jours maintenant que je reste bloqué sur un détail et mon ami Google ne m'a pas aidé à trouver la solution.
    Alors je m'adresse à vous, en espérant qu'un brillant esprit viendra éclairer ma lanterne

    Bien, je développe une application utilisant MVC 3 + Entity framework 4.1.
    J'arrive à récupérer ce dont j'ai besoin dans la base de données, la n'est pas le problème.
    Par contre, je dois accéder à différentes bases situées sur différents serveurs qui ne seront connus que lors du déroulement du programme, et là je bloque...

    Je m'explique:
    ( Ce qui suis est juste un exemple pour vous montrer à peu prés comment est l'environnement de mon coté )
    J'ai, par exemple, une classe produit avec les attributs suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public string IdProduit { get;set;}
    public string NomProduit { get; set;}
    public string Serveur { get;set;}
    public string DataBase { get; set;}
    Je passe sur le mapping et autres, ce qui donne que je récupère les données à partir de ma base de données principale.
    J'aurai par exemple ceci comme données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IdProduit = "4587", NomProduit="Cuisine", Serveur ="NSFS45", DataBase="ProdCuisine"
    IdProduit = "5712", NomProduit="Salle de Bain", Serveur ="NSFS54", DataBase="ProdSDB"
    etc ...
    Admettons ensuite que les infos de ce/ces produits sont stockées sur un serveur et base différent. ( que je connais grâce aux champs Serveur et Database )
    J'aimerai récupérer les informations qui y sont stockés.

    Mon problème ? Comment j'y accède ?
    Sachant que les noms du serveur et de la base ne seront connus que durant l’exécution de mon programme, je ne peux pas écrire à l'avance ma connectionString dans le Web.config.

    Par exemple, j'ai celle ci pour ma classe Produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <connectionStrings>
        <add name="ProduitDbContext" connectionString="Data Source=NSFS01;Initial Catalog=Produit; User Id=SuperUsr;Password=SuperPwd;" providerName="System.Data.SqlClient" />
      </connectionStrings>
    Voila, j’espère avoir été assez clair, si besoin je peux ré-expliquer .

    J'ai vu que il y avait moyen de créer la connectionString en utilisant EntityConnectionStringBuilder mais dans mon cas cela ne fonctionne pas ( je ne passe pas par EDMX )

    Donc si une âme charitable passe dans le coin, je lui en remercie d'avance

    .:AO:.

  2. #2
    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
    Bah ça a l'air d'une chaine de connexion SQL Server normale... tu peux donc utiliser SqlConnectionStringBuilder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        SqlConnectionStringBuilder sqlcsb = new SqlConnectionStringBuilder();
        sqlcsb.DataSource = "NSFS01";
        sqlcsb.InitialCatalog = "Produit";
        sqlcsb.UserID = "SuperUsr";
        sqlcsb.Password = "SuperPwd";

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut
    Salut tomlev et merci de ta réponse.

    Alors en effet, j'avais vu à plusieurs reprise l'utilisation de SqlConnectionStringBuilder. Cependant il était toujours accompagné d'un EntityConnectionStringBuilder comme l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
    sqlBuilder.MultipleActiveResultSets = true;
    sqlBuilder.DataSource = ".";
    sqlBuilder.InitialCatalog = "dpmr";
    sqlBuilder.IntegratedSecurity = true;
     
    EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
    entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
    entityBuilder.Metadata = "res://*/";
    entityBuilder.Provider = "System.Data.SqlClient";
    Mais je n'ai pas essayé juste en utilisant le SqlBuilder.
    Je vais essayer et je te tiens au courant.

    .:AO:.

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut
    Effectivement je me connecte à la base de données. Le problème c'est que derrière je dois effectuer une requête sql comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
         SqlConnectionStringBuilder sqlcsb = new SqlConnectionStringBuilder();
         sqlcsb.DataSource = "NSFS01";
         sqlcsb.InitialCatalog = "Produit";
         sqlcsb.IntegratedSecurity = true;
     
         SqlConnection cn = new SqlConnection();
         cn.ConnectionString = sqlcsb.ConnectionString;
         cn.Open();
     
         string strSQL = "SELECT description FROM Design WHERE id_sdb=440038";
         SqlCommand myCommand = new SqlCommand(strSQL, cn);
    mais je ne veux pas le faire de cette manière, mais plutôt passer par une classe ( vu que j'utilise entity framework ) avec Dbset et DbContext.

    Je vais voir ça.
    Merci encore.

    .:AO:.

  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
    DbContext a un constructeur qui prend en paramètre une DbConnection existante, donc tu n'as qu'à utiliser ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using(var context = new MyDbContext(cn))
    {
        string description = null;
        Design dsgn = context.Design.Find(440038);
        if (dsgn != null)
            description = dsgn.Description;
    }

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut
    Ah oui en effet, j'avais oublié.
    Je vais tester cela et je tiens au courant.

    Merci encore à toi

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut
    Et bien j'ai un petit problème lors de l'appel du constructeur parent.
    J'ai déclaré ma classe MyDbContext de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public MyDbContext(System.Data.Common.DbConnection cn) : base (cn)
    mais il me sort l'erreur suivante:
    The type 'System.Data.Objects.ObjectContext' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
    Ce qui est étrange c'est qu'il me demande une référence de EF4.0 alors que j'utilise EF4.1.
    Une idée ?

  8. #8
    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
    Euh... alors là je sais pas. Ton MyDbContext, il existait déjà, non ? Tu as juste ajouté un constructeur ?

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut
    J'ai rajouté la référence au 4.0 et j'ai plus l'erreur.
    Bizarre mais bon ...

    Il me reste une dernière étape et je pense que ça sera bon.
    Quand je fais mon .ToList() j'ai une exception:
    EntityConnection can only be constructed with a closed DbConnection.
    La je vois pas, je dois fermer ma connexion pour pouvoir lire la base ?? Ça n'a pas de sens ..

  10. #10
    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
    Il faut pas ouvrir la connection avant, c'est lui qui l'ouvrira quand il en aura besoin

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut
    En effet, j'ai plus l'exception.
    Maintenant ma requête tourne en boucle et ne s’arrête pas. J'ai surement fait quelque chose de travers à un endroit. Je vais regarder ça.

    Merci encore à toi de m'avoir éclairé

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut
    Et bien c'est nickel !
    Je récupère bien ce qu'il me faut. J'avais juste fait 2-3 petites erreurs.

    A noter que pour ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         using(var context = new MyDbContext(cn))
    Le constructeur prend un booléan en plus ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         using(var context = new MyDbContext(cn,true/false))
    mais bon rien de méchant.

    Grand merci à toi tomlev, tu m'as retiré une grosse écharde du pied.






    Je vais faire un petit résumé pour celles/ceux qui veulent faire la même chose ou qui rencontrent certains problèmes.
    Donc j'ai une classe (1) qui va récupérer les données que je souhaite en base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
         public class MaClasse
         {
            public int Idvar1 { get; set; }
            public int? Idvar2 { get; set; }
            public string chaine1 { get; set; }
            public string chaine2 { get; set; }
         }
    Ensuite j'ai une classe (2) qui hérite de DbContext et qui me permet de faire le mapping entre la base et ma classe (1) :
    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
     
        public class MyDbContext : DbContext
        {
            public MyDbContext(System.Data.Common.DbConnection cn, bool b) 
                : base (cn,b)
            {
                this.Configuration.LazyLoadingEnabled = false;
            }
     
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new MaClasseConfiguration());
            }
     
            public DbSet<MaClasse> oMaClasse { get; set; }
     
        }
     
        public class MaClasseConfiguration : EntityTypeConfiguration<MaClasse>
        {
            public MaClasseConfiguration()
                : base()
            {
     
                ToTable("TDESIGN", "dbo");
                HasKey(a => a.IdVar1);
     
                Property(p => p.IdVar1).HasColumnName("ID_COL1");
                Property(p => p.IdVar2).HasColumnName("ID_COL2");
                Property(p => p.chaine1).HasColumnName("ID_COL5");
                Property(p => p.chaine2).HasColumnName("ID_COL7");
     
            }
        }
    Ensuite voici le code qui permet de créer une connexion pendant le déroulement du programme et l'utiliser pour lancer le mapping de la classe (2) et récupérer les données via la classe (1) :
    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
     
         SqlConnectionStringBuilder sqlcsb = new SqlConnectionStringBuilder();
         sqlcsb.DataSource = databaseHost;
         sqlcsb.InitialCatalog = databaseName;
         sqlcsb.IntegratedSecurity = true;
         sqlcsb.UserID = SuperUsr;
         sqlcsb.Password = Pwd;
     
     
         SqlConnection cn = new SqlConnection();
         cn.ConnectionString = sqlcsb.ConnectionString;
     
         using (var context = new MyDbContext(cn, true))
         {
              List<MaClass> BdList = context.oMaClass.Where(p => p.IdVar2 == 440038).ToList();
         }
    Et voila vous récupérez vos infos.

    Encore merci et à une prochaine.
    .:AO:.

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

Discussions similaires

  1. création d'une liste dynamique aspx/vb
    Par akara dans le forum ASP.NET
    Réponses: 1
    Dernier message: 27/09/2007, 07h39
  2. <débutant> création d'une liste dynamique (aspx/vb)
    Par akara dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 11/09/2007, 15h46
  3. Création d'une bibiothèque dynamique.
    Par Pragmateek dans le forum C++
    Réponses: 22
    Dernier message: 31/03/2006, 22h00
  4. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17
  5. [Plugin] Création d'une vue dynamiquement
    Par The Bonze dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 15/06/2004, 13h23

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