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.
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>
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;
}
}
}
}
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
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.