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

C# Discussion :

Comment modifier le Data Source du appConfig dynamiquement [Débutant]


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Avril 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 18
    Par défaut Comment modifier le Data Source du appConfig dynamiquement
    Bonjour,

    Voilà j'ai une IHM avec des listViews qui affiche le contenu des tables, j'aimerai que quand je click sur "ouvrir" ça m'ouvre une dialogbox et que l'utilisateur choisisse une bdd pour après récupérer le chemin et le mettre dans le Data Source du fichier appconfig.
    Evidemment le schéma de la Bdd sera le même sauf que le contenu pourrait être différent d'ou l'utilité de ma fonction.
    Voilà mon code, merci d'être souple sur vos remarques sa fait qu'1 mois que je fais du c#/.net
    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
     
    private void ouvrirToolStripMenuItem_Click(object sender, EventArgs e)
            {
                String Filename="";
                OpenFileDialog Dialog = new OpenFileDialog();
                Dialog.InitialDirectory = "C:\\";
                Dialog.Filter ="sdf files (*.sdf)|*.sdf|All files (*.*)|*.*" ;
                if (Dialog.ShowDialog() == DialogResult.OK)
                {
                    Filename = Dialog.FileName;
     
                }
                string provider = "System.Data.SqlServerCe.4.0";
                DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
     
                DbConnectionStringBuilder builder = factory.CreateConnectionStringBuilder();
                builder.Add("Data Source", Filename);
     
                Configuration config = ConfigurationManager.OpenExeConfiguration(Filename);
     
                //Modifier une conn deja existante.
                ConnectionStringSettings cs = config.ConnectionStrings.ConnectionStrings["BDDFinalEntities"];
                cs.ConnectionString = builder.ConnectionString;
                config.Save();
    }
    Mon erreur est que cs.ConnectionString = builder.ConnectionString; ->
    La référence d'objet n'est pas définie à une instance d'un objet.
    Je comprend pas pourquoi car logiquement il l'es là non ?
    A force d'assimiler des infos je me perd, désolé si l'erreur est evidente

    Thomas

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConfigurationManager.OpenExeConfiguration(Filename);
    Pour moi fileName doit pointer vers un .exe et lui ira chercher le .config

  3. #3
    Membre averti
    Inscrit en
    Avril 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 18
    Par défaut
    Salut BenoitM,

    En effet jviens de m'en apercevoir, donc je dois le faire pointer sur le .exe de mon IHM? Car je comprend pas très bien sinon sur quoi pointer...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Voici quelques exemples
    http://msdn.microsoft.com/en-us/libr...gssection.aspx

    http://msdn.microsoft.com/en-us/libr...onstrings.aspx

    Donc dans ton application tu ajoutes un fichier de config (Add New Item/Application configuration file)
    Dans celui-ci tu indiques les connection possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <configuration>
      <connectionStrings>
        <add name="Local" connectionString="LocalSqlServer: data source=127.0.0.1;Integrated Security=SSPI;Initial Catalog=aspnetdb"
          providerName="System.Data.SqlClient" />
        <add name="SQLDev" connectionString="LocalSqlServer: data source=SQLDev;Integrated Security=SSPI;Initial Catalog=aspnetdb"
          providerName="System.Data.SqlClient" />
      </connectionStrings>
    </configuration>
    Dans ton application tu lis les connections possible et tu les ajoutes à ta combobox

    Tu utiliseras la connection string selectionné dans la combobox

  5. #5
    Membre averti
    Inscrit en
    Avril 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 18
    Par défaut
    Alors en faite vu j'utilise Entity Framework, j'ai déjà fais cette manip et mon fichier appConfig est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <connectionStrings>
        <add name="BDDFinalEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=|DataDirectory|\BddFinal.sdf&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>
    </configuration>

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    dans le 2eme liens tu as comment les lires

    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
     
    // Get the ConnectionStrings section.        
    // This function uses the ConnectionStrings 
    // property to read the connectionStrings
    // configuration section.
    public static void ReadConnectionStrings()
    {
     
      // Get the ConnectionStrings collection.
      ConnectionStringSettingsCollection connections =
          ConfigurationManager.ConnectionStrings;
     
      if (connections.Count != 0)
      {
        Console.WriteLine();
        Console.WriteLine("Using ConnectionStrings property.");
        Console.WriteLine("Connection strings:");
     
        // Get the collection elements.
        foreach (ConnectionStringSettings connection in 
          connections)
        {
          string name = connection.Name;
          string provider = connection.ProviderName;
          string connectionString = connection.ConnectionString;
     
          Console.WriteLine("Name:               {0}", 
            name);
          Console.WriteLine("Connection string:  {0}", 
            connectionString);
         Console.WriteLine("Provider:            {0}", 
            provider);
        }
      }
      else
      {
        Console.WriteLine();
        Console.WriteLine("No connection string is defined.");
        Console.WriteLine();
      }
    }

  7. #7
    Membre averti
    Inscrit en
    Avril 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 18
    Par défaut
    Oui d'accord, mais moi je voudrais juste pouvoir modifier le chemin du Data Source. Je veux pas les lires, ni les mettre en combobox.
    Je veux qu'au lieux d'avoir connectionString= "(...) Data Source=|DataDirectory|\BDDFinal.sdf (...)" j'ai le chemin récupéré de la OpenFileDialog.

    Je sais pas si je suis clair...

    la j'ai fais sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       string provider = "System.Data.SqlServerCe.4.0";
                DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
     
                DbConnectionStringBuilder builder = factory.CreateConnectionStringBuilder();
                builder.Add("data source", Filename );
                Configuration config = ConfigurationManager.OpenExeConfiguration(@"C:\(...)\WindowsFormsApplication2.exe");
     
                ConnectionStringSettings cs = config.ConnectionStrings.ConnectionStrings["BDDFinalEntities"];
                cs.ConnectionString = builder.ConnectionString;
                config.Save();
    sa plante pas mais mes listView se refresh pas donc je pense pas que sa marche, et après quand je relance il plante en me disant à cette ligne
    public BDDFinalEntities() : base("name=BDDFinalEntities", "BDDFinalEntities") ->
    Mot clé non pris en charge : 'data source'.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    euh si j'ai bien compris il me semble que tu te casse la tête pour pas grand chose un cree une constante
    private const string ConnectionString = "Data Source=myPath;Persist Security Info=False;"

    apres l'openDialog

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string myConnectionString = "Data Source=" +Dialog.FileName + " Persist Security Info=False;"
    pq veux tu l'as sauvé?

  9. #9
    Membre averti
    Inscrit en
    Avril 2012
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 18
    Par défaut
    Voilà j'ai réussi, sa fais un peu sale mais au moins ça marche

    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
     
     
    private void ouvrirToolStripMenuItem_Click(object sender, EventArgs e)
            {
                string Filename="";
                OpenFileDialog Dialog = new OpenFileDialog();
                Dialog.InitialDirectory = "C:\\";
                Dialog.Filter ="sdf files (*.sdf)|*.sdf|All files (*.*)|*.*" ;
                if (Dialog.ShowDialog() == DialogResult.OK)
                {
                    Filename = @Dialog.FileName;
     
                }
                //Modifier une conn deja existante à partir du path sélectionné par l'utilisateur
                EntityConnectionStringBuilder builder = new EntityConnectionStringBuilder();
                builder.ConnectionString = "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=\"Data Source=" +Filename + "\"";
                Configuration config = ConfigurationManager.OpenExeConfiguration(@"C:\Users\Thomas\Desktop\Thomas\ConsoleApplication\WindowsFormsApplication2\bin\Debug\WindowsFormsApplication2.exe");
                ConnectionStringSettings cs = config.ConnectionStrings.ConnectionStrings["BDDFinalEntities"];
                cs.ConnectionString = builder.ConnectionString;
                config.Save();
    Par contre après mes listView ce remplisse pas ... je suis obliger de mettre le save() et de re lancer l'appli. Mais bon ça c'est encore une autre histoire...
    J'essaye de trouver le problème rapidement sinon je mettrai résolu

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 249
    Par défaut
    après ton config.save(), fais un config.relaod(), et éventuellement entre les 2, fais un refresh de la section.

    Voici le code que j'utilise pour modifier le ConnectionString de la config d'application pour la liaison à une base de données Access :
    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
            /// <summary>
            /// Modifie la base de donnée source
            /// </summary>
            /// <param name="DatabasePath">FullPath MDB</param>
            public void ConnectionStringChange(string DatabasePath)
            {
                System.Data.OleDb.OleDbConnectionStringBuilder MDBConnectionStringBuilder = new System.Data.OleDb.OleDbConnectionStringBuilder();
                MDBConnectionStringBuilder.Provider = "Microsoft.Jet.OLEDB.4.0";
                MDBConnectionStringBuilder.DataSource = DatabasePath;
                System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
                System.Configuration.ConnectionStringsSection connectionStringsSection = (System.Configuration.ConnectionStringsSection)config.GetSection("connectionStrings");
                connectionStringsSection.ConnectionStrings["NameSpace.Properties.Settings.NomConnectionString"].ConnectionString = MDBConnectionStringBuilder.ConnectionString;
                config.Save();
                System.Configuration.ConfigurationManager.RefreshSection("connectionStrings");
                NameSpace.Properties.Settings.Default.Reload();
            }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/04/2009, 12h57
  2. Réponses: 1
    Dernier message: 22/08/2008, 18h39
  3. Réponses: 4
    Dernier message: 19/06/2008, 15h22
  4. [Texte] comment modifier dynamiquement ?
    Par frelep dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/09/2005, 11h46

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