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