Avatar billede spif2001 Nybegynder
24. august 2006 - 14:48 Der er 16 kommentarer og
1 løsning

Gemme værdier i config filen

Hej

Jeg prøver at hente / gemme en database connection streng og en mail server streng (brugt til at sende mail via en SmtpClient)i mit programs config fil således:

[CODE]
get
{
    Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    return cfg.ConnectionStrings.ConnectionStrings["MyApp.Properties.Settings.MyConnectionString"].ConnectionString;
}
set
{
    try
    {
        Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        cfg.ConnectionStrings.ConnectionStrings["MyApp.Properties.Settings.MyConnectionString"].ConnectionString = value;
        cfg.Save(ConfigurationSaveMode.Modified);
    }
    catch
    { }
}

public string MailServer
{
    get
    {
        return MyApp.Properties.Settings.Default.MailServerName;
    }
    set
    {
        MyApp.Properties.Settings.Default.MailServerName = value;
        MyApp.Properties.Settings.Default.Save();
    }
}
[/CODE]

Begge strenge er oprettet v.h.a. Projektets Property Settings faneblad i VS 2005.

Database Connection strengen fungere fint med hent/gem, men mail strengen kan jeg kun hente - ikke gemme. Den kommer ikke med nogen fejl, den gemmer bare ikke...

Nogen der kan sige mig hvorfor? Eller som har en anden løsning til at gemme den mail streng i den config fil?
Avatar billede segato Nybegynder
27. august 2006 - 21:43 #1
Det er sikkert fordi du kører i debug mode? Du skal huske hver gang du kører bliver en ny konfig fil kopieret til din debug folder. Husk det er den fil du skal tjekke.
Avatar billede spif2001 Nybegynder
28. august 2006 - 08:57 #2
Nope - den har jeg faldet i for et par dage siden:

http://www.eksperten.dk/spm/725502

og som jeg skriver, så gemmer den fint med Connection String, men ikke med andre settings - der er jo selvf. også forskel på hvordan man gemmer, men for hulen da - Save() betyder vel Save()???
Avatar billede segato Nybegynder
28. august 2006 - 09:19 #3
Det skulle man mene jeg gemmer hele collections i min config uden problemmer.
Avatar billede spif2001 Nybegynder
28. august 2006 - 09:54 #4
PÅ samme måde, som jeg gemmer min MailServer string?
Avatar billede segato Nybegynder
28. august 2006 - 13:14 #5
Næsten samme måde. Prøv min og se om det virker for dig. Det virker for mig:
System.Configuration.Configuration m_config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

void UpdateConfig()
        {
            m_config.AppSettings.Settings["ExecutionDelay"].Value = txtDelay.Text;           

            m_config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
        }
Avatar billede segato Nybegynder
28. august 2006 - 13:15 #6
Her er min config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="ExecutionDelay" value="500" />   
  </appSettings>
</configuration>
Avatar billede segato Nybegynder
28. august 2006 - 13:16 #7
Gad vide om det er den her du mangler:
ConfigurationManager.RefreshSection("appSettings");
Avatar billede spif2001 Nybegynder
28. august 2006 - 13:32 #8
Bruger du .Net 2.0 eller 1.1?

Min config fil er ikke identisk med din - ser sådan ud:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="MyApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <connectionStrings>
        <add name="MyApp.Properties.Settings.MyConnectionString"
            connectionString="Data Source=MBU\MYMSSQL;Initial Catalog=Farm;Integrated Security=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <applicationSettings>
        <MyApp.Properties.Settings>
            <setting name="MailServerName" serializeAs="String">
                <value>pasmtp.tele.dk</value>
            </setting>
            <setting name="UseMSOutlook" serializeAs="String">
                <value>True</value>
            </setting>
        </MyApp.Properties.Settings>
    </applicationSettings>
</configuration>
Avatar billede spif2001 Nybegynder
28. august 2006 - 13:33 #9
og jeg bruger 2.0 - glemte jeg lige at skrive... tsk tsk
Avatar billede segato Nybegynder
28. august 2006 - 13:58 #10
Jeg bruger 2.0. Du kan kun skrive til din app.config fra 2.0. Prøv minkode og se om det ikke vil virke. Er jeg ret overbevist om det vil. Så tilret det til din kode.
Avatar billede spif2001 Nybegynder
28. august 2006 - 14:08 #11
Virker ikke med din kode.

Jeg må indrømme, at jeg finder det noget mystisk, at vi ikke har samme tag navn i xml'en - appSettings vs. applicationSettings - og at din Value er en attribut, hvor min er et childtag.

Jeg har ikke lavet xml selv - fik den autogeneret da jeg bruger Settings fanebladet i nit projekts properties.
Avatar billede spif2001 Nybegynder
28. august 2006 - 14:21 #12
Så er det tid igen:

*giver mig selv et nakkedrag*

Jeg fik ikke ændret Scope attributten til user. Det er åbenbart kun ConnectionStrings der kan ændres i runtime, hvis de er sat til Application i Scope. Andre tilføjede værdier skal sættes til User i Scope.

Smid et svar som tak for hjælpen, og et skub, der fik mig til at lede længere inde og tænke lidt mere over, hvad jeg havde gang i ;)
Avatar billede spif2001 Nybegynder
28. august 2006 - 14:23 #13
By the way virkede min egen kode fint efter Scopet blev ændret, så

ConfigurationManager.RefreshSection("appSettings");

havde egentlig ikke nogen effekt i mit scenario.
Avatar billede segato Nybegynder
28. august 2006 - 14:41 #14
Okay det var da så lidt. Selv om jeg ikke fattede en krone af hvad der var galt med hensyn til user og applikation scope :D Men jo os vigtigst du har styr på det :D
Avatar billede segato Nybegynder
28. august 2006 - 14:41 #15
svar :D
Avatar billede spif2001 Nybegynder
28. august 2006 - 14:45 #16
hvis du går ind i dit projekts properties og vælger fanebladet Settings (kræver selvf. VS 2005), så kan man her for hver setting sætte Scope.

Ydermere er der et link øverst i det faneblad, der henviser til en MSDN forklaring på Settings. Det var den jeg "kom til" at læse, og faldt over det med scope.
Avatar billede segato Nybegynder
28. august 2006 - 15:57 #17
Ok den havde jeg ik lige set.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester