2009-03-20 8 views
1

Est-il possible de modifier les chaînes de connexion définies dans app.config/web.config lors de l'exécution? Je veux utiliser différents fichiers de configuration en fonction de la machine sur laquelle l'application/le site est exécuté (uniquement à des fins de débogage, bien sûr, nous utiliserons les fichiers de configuration habituels lors du déploiement).Est-il possible de modifier la configuration ConnectionStrings lors de l'exécution?

Je peux écrire AppSettings, mais pas ConnectionStrings (AFAIK). Ou puis-je?

+0

Re votre "par développeur" - Je vais ajouter une pensée supplémentaire ... –

Répondre

2

Oui c'est possible, mais AFAIK seulement par Reflection. Le code suivant devrait faire ce que vous avez besoin (lire ci-dessous pour l'utilisation):

public static string SetConnectionString(Type assemblyMember, 
             Type settingsClass, 
             string newConnectionString, 
             string connectionStringKey) 
{ 
    Type typSettings = Type.GetType(Assembly.CreateQualifiedName(assemblyMember.Assembly.FullName, settingsClass.FullName)); 

    if (typSettings == null) 
    { 
    return null; 
    } 

    PropertyInfo prpDefault = typSettings.GetProperty("Default", BindingFlags.Static | BindingFlags.Public); 

    if (prpDefault == null) 
    { 
    return null; 
    } 

    object objSettings = prpDefault.GetValue(null, null); 

    if (objSettings == null) 
    { 
    return null; 
    } 

    // the default property, this[], is actually named Item 
    PropertyInfo prpItem = objSettings.GetType().GetProperty("Item", BindingFlags.Instance | BindingFlags.Public); 

    if (prpItem == null) 
    { 
    return null; 
    } 

    object[] indexerName = { connectionStringKey }; 
    string oldConnectionString = (string)prpItem.GetValue(objSettings, indexerName); 

    prpItem.SetValue(objSettings, newConnectionString, indexerName); 

    return oldConnectionString; 
} 

assemblyMember est le type d'appel
settingsClass est le type de vos paramètres de classe
newConnectionString est la chaîne complète pour définir
connectionStringKey est le nom de la chaîne de connexion que vous avez définie dans les paramètres de votre application

Vous devriez appeler cette méthode dès que possible après le démarrage de votre application, de préférence dans la méthode Main().

+0

Merci, je vais essayer ça. – Inferis

+1

Cela peut être beaucoup plus simple: http://david.gardiner.net.au/2008/09/programmatically-setting.html http://stackoverflow.com/a/8494274 – user423430

0

Vous ne pouvez pas vraiment modifier le fichier de configuration du processus en cours d'exécution. Une option (avec le pour et le contre) est d'utiliser les données de configuration dans le fichier machine.config ou le fichier web.config maître (pour "site", vous utilisez les nœuds "location") - pas une option pour se précipiter dans, bien que.

Une meilleure façon de gérer cela est d'échanger le fichier de configuration dans le cadre de votre processus de génération/déploiement, idéalement automatisé. De cette façon, tout est autonome, et vous pouvez "robocopy" à un serveur vanilla et le faire fonctionner.


Re votre point «par développeur»; J'ai trouvé que la façon la plus simple de le faire était de normaliser la configuration et de modifier les machines. Par exemple, nous exécutons un serveur Web local sur une machine virtuelle; plutôt que du code contre chaque machine, nous standardisons sur "localserver" (pour refléter "localhost"), et ajoutons un enregistrement DNS local à chaque machine que le développeur peut contrôler. Notez que cela nécessite des adresses IP fixes (ou peut-être une réservation DHCP) pour l'empêcher de changer au fil du temps!

Ditto bases de données; les serveurs locaux peuvent utiliser "."; les serveurs distants peuvent être aliasés sur la machine, de sorte que "devserver" pointe vers ce que l'utilisateur veut.

Juste une pensée ...

+0

Eh bien, nous le faisons pour les tests/production. Je souhaite pouvoir remplacer les chaînes de connexion "par développeur". – Inferis

1

J'ai essayé une fois dans mon projet pour le débogage mais n'a pas pu le faire, le problème (je suppose, me corriger si je me trompe) est en application démarrer l'application .config est chargé dans la mémoire, les modifications apportées à app.config pendant que l'application s'exécute ne sont pas reflétées. Pour remédier à cela, voici ce que j'ai fait, définissez toutes les chaînes de connexion dans app.config et appelez celles que vous voulez quand votre programme fonctionne comme ça. Par exemple, supposons que vous avez défini vos chaînes de connexion dans app.config comme suit.

<connectionStrings> 
    <add name="YourNameSpace.Properties.Settings.ConnectionString_1" 
     connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data 
     Source=|DataDirectory|\file.mdb" 
     providerName="System.Data.OleDb"/> 

    <add name="YourNameSpace.Properties.Settings.ConnectionString_2" 
     connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data 
     Source=|DataDirectory|\file.mdb" 
     providerName="System.Data.OleDb"/> 

</connectionStrings> 

définissent autant que vous voulez (vous déboguez droite :-)) puis d'appeler les paramètres de connexion dans votre code quelque chose comme ça:

YourNameSpace.Properties.Settings foo = new YourNameSapce .Properties.Settings();

foo.ConnectionString_1;

HTH

Cordialement

@nand

P.S: Cette réponse est spécifique à C#.

0

Cet article va dans le détail sur les options que vous avez: http://aspalliance.com/820

+0

Cela n'apporte rien de nouveau. J'ai dit que je suis capable de modifier AppSettings, mais ce sont les connectionstrings qui me donnent des maux de tête. – Inferis

0

Vous pouvez exécuter xmlpoke dans un script NAnt lors de l'installation du site.

E.g.

  1. Déployez le NAnt avec le site Web.
  2. Créez un go.bat qui appelle NAnt qui installe le site et fait xmlpoke pour modifier le fichier web.config avec des paramètres basés sur le nom du serveur ou un autre paramètre.