Question

i have custom config section like

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="DBConfiguration" type="NewSQLExecuter.DBConfigurationSection, NewSQLExecuter"/>
    </configSections>

    <DBConfiguration>
        <Items>
            <add servername="192.168.50.2\db1" dbname="test1" userid="sa" password="2222m@n" countrycode="GB" />
            <add servername="192.168.60.2\db2" dbname="test2" userid="sa" password="22222n" countrycode="US" />
            <add servername="192.168.70.2\db3" dbname="test3" userid="sa" password="3333" countrycode="DE" />
        </Items>
    </DBConfiguration>

</configuration>

i have written a class which read data from custom config section...the class code as follows.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace NewSQLExecuter
{

    public class DBConfigurationSection : ConfigurationSection
    {
        [ConfigurationProperty("Items")]
        public ItemsCollection Items
        {
            get { return ((ItemsCollection)(base["Items"])); }
        }
    }

    [ConfigurationCollection(typeof(ItemsElement))]
    public class ItemsCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ItemsElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ItemsElement)(element)).CountryCode;
        }

        public ItemsElement this[int idx]
        {
            get
            {
                return (ItemsElement)BaseGet(idx);
            }
        }
    }

    public class ItemsElement : ConfigurationElement
    {
        [ConfigurationProperty("servername", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string ServerName
        {
            get
            {
                return ((string)(base["servername"]));
            }
            set
            {
                base["servername"] = value;
            }
        }

        [ConfigurationProperty("dbname", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string DBName
        {
            get
            {
                return ((string)(base["dbname"]));
            }
            set
            {
                base["dbname"] = value;
            }
        }

        [ConfigurationProperty("userid", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string UserID
        {
            get
            {
                return ((string)(base["userid"]));
            }
            set
            {
                base["userid"] = value;
            }
        }

        [ConfigurationProperty("password", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Password
        {
            get
            {
                return ((string)(base["password"]));
            }
            set
            {
                base["password"] = value;
            }
        }

        [ConfigurationProperty("countrycode", DefaultValue = "", IsKey = true, IsRequired = true)]
        public string CountryCode
        {
            get
            {
                return ((string)(base["countrycode"]));
            }
            set
            {
                base["countrycode"] = value;
            }
        }
    }
}

this way i iterate the custom config data and get the value

DBConfigurationSection section = (DBConfigurationSection)ConfigurationManager.GetSection("DBConfiguration");

if (section != null)
{
    DateTime satrt = DateTime.Now;

    for (int i = 0; i <= section.Items.Count - 1; i++)
    {
        var country = section.Items[i].CountryCode; ;
        var constring = string.Format("{0}{1}{2}{3}", "UID=" + section.Items[i].UserID, ";PWD=" + section.Items[i].Password, 
                                    ";Server=" + section.Items[i].ServerName, ";Database=" + section.Items[i].DBName); 
        dicList.Add(country, constring);
    }
}

the code works fine but i want to add one more feature like search any config data by any key value like

if(section.key.userid=="joy")
{
    string pwd=section.key.password
}

So guide me how could add search functionality into my class. it would be nice if i could use LINQ to search for any custom config data. so please guide me thanks.

Getting error to handle two custom config section in app.config file

my app.config file look like

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="DBConfiguration" type="CSRAssistant.DBConfigurationSection, CSRAssistant"/>
        <section name="LoginConfiguration" type="CSRAssistant.LoginConfigurationSection, CSRAssistant"/>
    </configSections>

    <DBConfiguration>
        <add servername="dbname" dbname="BBAJobBoardForGB" userid="sa" password="222" countrycode="GBR" />
        <add servername="db2" dbname="BBAJobBoardForUS" userid="sa" password="swww" countrycode="USA" />

    </DBConfiguration>

    <LoginConfiguration>
        <add UserName="ww" Pwd="ww" Country="GBR"/>
        <add UserName="ss" Pwd="ss"  Country="USA"/>
        <add UserName="dd" Pwd="dd"  Country="CAD"/>
    </LoginConfiguration>
    <appSettings>
        <add key="MailID" value="tridip@bba-reman.com" />
    </appSettings>

    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
        <requiredRuntime version="v4.0.20506"/>
    </startup>

</configuration>

to handle two section my code follows as

namespace CSRAssistant
{

    public class DBConfigurationSection : ConfigurationSection
    {
        //[ConfigurationProperty("Items")]
        //public ItemsCollection Items
        //{
        //    get { return ((ItemsCollection)(base["Items"])); }
        //}

        [ConfigurationProperty("", IsDefaultCollection = true)]
        public ItemsCollection Items 
        { 
            get 
            { 
                return ((ItemsCollection)(base[""])); 
            } 
        }
    }

    [ConfigurationCollection(typeof(ItemsElement))]
    public class ItemsCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ItemsElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ItemsElement)(element)).CountryCode;
        }

        public ItemsElement this[int idx]
        {
            get
            {
                return (ItemsElement)BaseGet(idx);
            }
        }
    }

    public class ItemsElement : ConfigurationElement
    {
        [ConfigurationProperty("servername", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string ServerName
        {
            get
            {
                return ((string)(base["servername"]));
            }
            set
            {
                base["servername"] = value;
            }
        }

        [ConfigurationProperty("dbname", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string DBName
        {
            get
            {
                return ((string)(base["dbname"]));
            }
            set
            {
                base["dbname"] = value;
            }
        }

        [ConfigurationProperty("userid", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string UserID
        {
            get
            {
                return ((string)(base["userid"]));
            }
            set
            {
                base["userid"] = value;
            }
        }

        [ConfigurationProperty("password", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Password
        {
            get
            {
                return ((string)(base["password"]));
            }
            set
            {
                base["password"] = value;
            }
        }

        [ConfigurationProperty("countrycode", DefaultValue = "", IsKey = true, IsRequired = true)]
        public string CountryCode
        {
            get
            {
                return ((string)(base["countrycode"]));
            }
            set
            {
                base["countrycode"] = value;
            }
        }
    }

    public class LoginConfigurationSection : ConfigurationSection
    {
        //[ConfigurationProperty("Items")]
        //public ItemsCollection Items
        //{
        //    get { return ((ItemsCollection)(base["Items"])); }
        //}

        [ConfigurationProperty("", IsDefaultCollection = true)]
        public ItemsCollection Items
        {
            get
            {
                return ((ItemsCollection)(base[""]));
            }
        }
    }


    public class LoginElement : ConfigurationElement
    {
        [ConfigurationProperty("UserName", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string UserName
        {
            get
            {
                return ((string)(base["UserName"]));
            }
            set
            {
                base["UserName"] = value;
            }
        }

        [ConfigurationProperty("Pwd", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Pwd
        {
            get
            {
                return ((string)(base["Pwd"]));
            }
            set
            {
                base["Pwd"] = value;
            }
        }

        [ConfigurationProperty("Country", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Country
        {
            get
            {
                return ((string)(base["Country"]));
            }
            set
            {
                base["Country"] = value;
            }
        }

    }
}

read the two custom config setting like this way

string joyPassword = "";
            LoginConfigurationSection LoginConfigurationSection = (LoginConfigurationSection)ConfigurationManager.GetSection("LoginConfiguration");
            if (LoginConfigurationSection != null)
            {
                var UserCredentials = LoginConfigurationSection.Items
                                    .Cast<LoginElement>()
                                    .FirstOrDefault(_element => _element.UserName == "razi");

                if (UserCredentials != null)
                    joyPassword = UserCredentials.Country;



                DBConfigurationSection section = (DBConfigurationSection)ConfigurationManager.GetSection("DBConfiguration");
                if (section != null)
                {
                    var DbConnection = section.Items
                                        .Cast<ItemsElement>()
                                        .FirstOrDefault(_element => _element.CountryCode.ToUpper() == joyPassword.ToUpper());

                    if (DbConnection != null)
                        joyPassword = DbConnection.ServerName;
                }
            }

now i am getting error like at runtime Unrecognized attribute 'UserName'. Note that attribute names are case-sensitive.

why Unrecognized attribute 'UserName' just do not understand....if possible please guide me. thanks

Was it helpful?

Solution

You could probably just do something like this:

var joyUserElement = section.Items
    .Cast<ItemsElement>()
    .FirstOrDefault(_element => _element.UserID == "joy");

if (joyUserElement != null)
    string joyPassword = joyUserElement.Password;

Does this make sense to you? I may be missing something here since this was not tested, but it should work fine.

I see you are using a normal for instead of foreach there too. Remember that the collection is IEnumerable, so you can just use a foreach with explicit typing, like this:

foreach(ItemElement element in section.Items)

Two more points I would like to add to this:

  • I would suggest you rename your element class to reflect what it actually is, for instance DbConfigurationElement instead of ItemElement. This will make the code a bit more clear in the long run.

  • You can 'hide' the <Items> tag in the xml there if it has no special meaning (which seems to be the case). If you annotate your collection property like this

.

[ConfigurationProperty("", IsDefaultCollection = true)]
public ItemsCollection Items
{
    get { return ((ItemsCollection)(base[""])); }
}

You can then write your section like this:

<DBConfiguration>
    <add servername="192.168.50.2\db1" dbname="test1" userid="sa" password="2222m@n" countrycode="GB" />
    <add servername="192.168.60.2\db2" dbname="test2" userid="sa" password="22222n" countrycode="US" />
    <add servername="192.168.70.2\db3" dbname="test3" userid="sa" password="3333" countrycode="DE" />
</DBConfiguration>

This is very useful for small, single collection config sections like yours.

OTHER TIPS

hi this way you can do it.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="DBConfiguration" type="CSRAssistant.DBConfigurationSection, CSRAssistant"/>
        <section name="LoginConfiguration" type="CSRAssistant.LoginConfigurationSection, CSRAssistant"/>
      </configSections>

      <DBConfiguration>
        <add servername="192.168.88.2\bbareman" dbname="BBAJobBoardForGB" userid="sa" password="8B@R5m@n" countrycode="GBR" />
        <add servername="192.168.1.2\bbareman" dbname="BBAJobBoardForUS" userid="sa" password="8B@R5m@n" countrycode="USA" />
        <add servername="192.168.2.2\bbareman" dbname="BBAJobBoardForDE" userid="sa" password="8B@R5m@n" countrycode="DEU" />
        <add servername="192.168.77.10\bbareman" dbname="BBAJobBoardForFR" userid="sa" password="8B@R5m@n" countrycode="FRA" />
        <add servername="192.168.3.2\bbareman" dbname="BBAJobBoardForIT" userid="sa" password="8B@R5m@n" countrycode="ITA" />
        <add servername="192.168.4.2\bbareman" dbname="BBAJobBoardForCA" userid="sa" password="8B@R5m@n" countrycode="CAD" />
        <add servername="192.168.55.10\bbareman" dbname="BBAJobBoardForES" userid="sa" password="8B@R5m@n" countrycode="ESP" />
      </DBConfiguration>

      <LoginConfiguration>
        <add ID="1" UserName="suanguite" Pwd="gguite" Country="GBR"/>
        <add ID="2" UserName="sujoy" Pwd="sujoyUS"  Country="USA"/>
        <add ID="3" UserName="sujoy" Pwd="sujoyCA"  Country="CAD"/>
        <add ID="4" UserName="pjasu" Pwd="pjasuDE"  Country="DEU"/>
        <add ID="5" UserName="kankana" Pwd="kankana123"  Country="ITA"/>
        <add ID="6" UserName="test" Pwd="test"  Country="IND"/>
        <add ID="7" UserName="biswajit" Pwd="biswajitES"  Country="ESP"/>
        <add ID="8" UserName="suparna" Pwd="suparna"  Country="CAD"/>
        <add ID="9" UserName="razi" Pwd="raziFR"  Country="FRA"/>
        <add ID="10" UserName="tridip" Pwd="tridip"  Country="GBR"/>
        <add ID="11" UserName="tridip" Pwd="tridip"  Country="ESP"/>
        <add ID="12" UserName="tridip" Pwd="tridip"  Country="FRA"/>
      </LoginConfiguration>
      <appSettings>
        <add key="MailID" value="tridip@bba-reman.com" />
      </appSettings>

      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
        <requiredRuntime version="v4.0.20506"/>
      </startup>

    </configuration>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace CSRAssistant
{
    public class DBConfigurationSection : ConfigurationSection
    {
        //[ConfigurationProperty("Items")]
        //public ItemsCollection Items
        //{
        //    get { return ((ItemsCollection)(base["Items"])); }
        //}

        [ConfigurationProperty("", IsDefaultCollection = true)]
        public ItemsCollection Items
        {
            get
            {
                return ((ItemsCollection)(base[""]));
            }
        }
    }

    [ConfigurationCollection(typeof(ItemsElement))]
    public class ItemsCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ItemsElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ItemsElement)(element)).CountryCode;
        }

        public ItemsElement this[int idx]
        {
            get
            {
                return (ItemsElement)BaseGet(idx);
            }
        }
    }

    public class ItemsElement : ConfigurationElement
    {
        [ConfigurationProperty("servername", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string ServerName
        {
            get
            {
                return ((string)(base["servername"]));
            }
            set
            {
                base["servername"] = value;
            }
        }

        [ConfigurationProperty("dbname", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string DBName
        {
            get
            {
                return ((string)(base["dbname"]));
            }
            set
            {
                base["dbname"] = value;
            }
        }

        [ConfigurationProperty("userid", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string UserID
        {
            get
            {
                return ((string)(base["userid"]));
            }
            set
            {
                base["userid"] = value;
            }
        }

        [ConfigurationProperty("password", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Password
        {
            get
            {
                return ((string)(base["password"]));
            }
            set
            {
                base["password"] = value;
            }
        }

        [ConfigurationProperty("countrycode", DefaultValue = "", IsKey = true, IsRequired = true)]
        public string CountryCode
        {
            get
            {
                return ((string)(base["countrycode"]));
            }
            set
            {
                base["countrycode"] = value;
            }
        }
    }


}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace CSRAssistant
{
    //****login config

    public class LoginConfigurationSection : ConfigurationSection
    {
        //[ConfigurationProperty("Items")]
        //public ItemsCollection Items
        //{
        //    get { return ((ItemsCollection)(base["Items"])); }
        //}

        [ConfigurationProperty("", IsDefaultCollection = true)]
        public LoginCollection Items
        {
            get
            {
                return ((LoginCollection)(base[""]));
            }
        }
    }

    [ConfigurationCollection(typeof(LoginElement))]
    public class LoginCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new LoginElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((LoginElement)(element)).ID;
        }

        public LoginElement this[int idx]
        {
            get
            {
                return (LoginElement)BaseGet(idx);
            }
        }
    }
    public class LoginElement : ConfigurationElement
    {
        [ConfigurationProperty("UserName", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string UserName
        {
            get
            {
                return ((string)(base["UserName"]));
            }
            set
            {
                base["UserName"] = value;
            }
        }

        [ConfigurationProperty("Pwd", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Pwd
        {
            get
            {
                return ((string)(base["Pwd"]));
            }
            set
            {
                base["Pwd"] = value;
            }
        }

        [ConfigurationProperty("Country", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Country
        {
            get
            {
                return ((string)(base["Country"]));
            }
            set
            {
                base["Country"] = value;
            }
        }

        [ConfigurationProperty("ID", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string ID
        {
            get
            {
                return ((string)(base["ID"]));
            }
            set
            {
                base["ID"] = value;
            }
        }
    }
}

calling way

private void button1_Click_1(object sender, EventArgs e)
        {
            string _country = "";
            string _ServerName = "";
            LoginConfigurationSection LoginConfigurationSection = (LoginConfigurationSection)ConfigurationManager.GetSection("LoginConfiguration");
            if (LoginConfigurationSection != null)
            {
                var UserCredentials = LoginConfigurationSection.Items
                                    .Cast<LoginElement>()
                                    .FirstOrDefault(_element => _element.UserName == "razi");

                if (UserCredentials != null)
                    _country = UserCredentials.Country;



                DBConfigurationSection section = (DBConfigurationSection)ConfigurationManager.GetSection("DBConfiguration");
                if (section != null)
                {
                    var DbConnection = section.Items
                                        .Cast<ItemsElement>()
                                        .FirstOrDefault(_element => _element.CountryCode.ToUpper() == _country.ToUpper());

                    if (DbConnection != null)
                        _ServerName = DbConnection.ServerName;
                }
            }
        }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top