Mis-spelling in the .NET configuration system, a design flaw? - c#

I just wrote some .NET code to get connection string from the config file. The config file is as below:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="key1" value="hello,world!"/>
</appSettings>
<connectionStrings>
<add name="conn1" connectionString="abcd"/>
</connectionStrings>
</configuration>
.NET Framework provide the following types to get the connection string:
1- ConnectionStringsSection : stands for the config section containing several connection strings
2- ConnectionStringSettingsCollection : stands for the connection string collection
3- ConnectionStringSettings : stands for a certain connection string.
.NET Framework also provide the following types to get the App Settings:
4- AppSettingsSection
5- KeyValueConfigurationCollection
6- KeyValueConfigurationElement
Compare 2 to 5, 3 to 6, why are there extra "s" in ConnectionStringSetting[s]Collection and ConnectionStringSetting[s]?
This mis-spelling is really mis-leading. I think it's a design flaw.
Has anyone noticed that?

Because its in English. Settings implies multiple as does Configuration. A configuration can have multiple properties but a setting is one 'thing'. Configurations would imply a collection of multiple properties. Not a typo just an English language quirk

Related

Configuration file - encrypting connection string

I'm trying to develop a C# Winform application, which connects to SQL database.
So far I was able to move the most sensitive data from my XML configuration file to an external XML configuration file, but that's it.
The last thing I have to do is to encrypt that file, as many people will have access to a directory in which application is located.
My main [APP] configuration file looks as follows:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings configSource="conn_string.config"/>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>
And there is my [conn_string] external configuration file in which I'm trying to hide a connection string:
<?xml version="1.0" encoding="utf-8" ?>
<connectionStrings>
<add name="myConnectionStringName"
providerName="System.Data.SqlClient"
connectionString="Data Source=ServerName;Initial
Catalog=InitialDatabaseName;User=UserName;Password=MyPassword;Application Name=MyAppName" />
</connectionStrings>
Now when it comes to encryption I have read that asp-netregiis.exe is looking only for file named "web"
so I temporarily renamed my "conn_string" file to "web"
And tried the encryption(via developer command line VS):
aspnet_regiis -pef "connectionStrings" "path_to_my_conn_string_file"
The result is: ~My translation
The web.config file doesn't contain a configuration tag
So I added one like this:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="myConnectionStringName"
providerName="System.Data.SqlClient"
connectionString="Data Source=ServerName;Initial
Catalog=InitialDatabaseName;User=UserName;Password=MyPassword;Application Name=MyAppName" />
</connectionStrings>
</configuration>
Now it complains about: ~Again my translation
File format configSource must be an element conatining section name
The steps you are taking that use aspnet_Regiis are really intended for web applications hosted in Internet Information Server (IIS). The file it is looking for is really "web.config." You mentioned that the app being constructed is a winforms application, which isn't a web application. Regular winforms applications are generally configured via a file called "app.config." Visual Studio may have created a base app.config for you depending on the version you're using.
You can "trick" aspnet_Regiis into encrypting your configuration file by temporarily renaming app.config to web.config, and then invoking aspnet_regiis with a flag that points to the exact path of our "phony" web.config:
For simplicity, let's say your initial app.config resides in c:\MyPrograms\MyApp.
Rename app.config to web.config.
From an administrative command prompt, set your current directory to c:\windows\micrsoft.net\framework\v4.0.30319
Invoke aspnet_regiis, using the "-pef" switch to instruct the tool to encrypt a particular section of your web.config:
aspnet_regiis -pef "connectionStrings" c:\MyPrograms\MyApp
If you see a "Succeeded" message, rename your web.config back to app.config, and run your application. .NET should decrypt your connection string automatically at runtime on that machine.
If you need to put this application on other machines, you may need to consider setting up a common encryption key that can be installed on other machines as well as define a provider in web.config that leverages that key. But for now, let's get the basic process working locally, and then worry about the other components once we know this part is working.
Hope this helps!

Connection string in EF

I’m a student. And this is my first production level project. I’m developing a WPF application using Entity Framework, which will be running only on a tab. I have problem in choosing a database. Since this application is going to run only on one device and cloud database cannot be used, what would be the best option?
If I use mssql the connection string in my development environment and production environment differs. Am I wrong? If I’m right what would be the solution for having a connection string that works identically in both environments.
Thanks in advance.
Usually you always end up with a different connection string for development (ex: without password) and for production (ex: long password).
C# handles this with App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="yourname" connectionString="..." providerName="MySql.Data.MySqlClient" />
</connectionStrings>
</configuration>
And then you'll add a transformation file that changes certain values of your App.config depending on the environment where you'll deploy it.
Typically there is an App.Release.config file that updates the connectionString when built in Release mode (versus Debug mode)
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add name="yourname"
connectionString="productionConnectionStringHere"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
</configuration>
As to which database you're going to use: It doesn't really matter. Have a look at Sqlite. Or Mongo if you don't have tabular data.

Duplicate keys under app.config

I have a project where I maintain separate app.config files for connection strings for each environment, for example, a Dev.config for the dev env, QA.config for QA, etc. I have a master app.config file where I just key in the env as "Dev" or "QA" and the env specific connection strings are activated as shown below.
Dev.config
<?xml version="1.0" encoding="utf-8" ?>
<connectionStrings>
<add name="connection1" connectionString="<dev_string>" />
<add name="connection2" connectionString="<dev_string>"/>
</connectionStrings>
QA.config
<?xml version="1.0" encoding="utf-8" ?>
<connectionStrings>
<add name="connection1" connectionString="<qa_string>" />
<add name="connection2" connectionString="<qa_string>"/>
</connectionStrings>
App.config
<connectionStrings configSource="ConnectionStrings\Dev.config">
</connectionStrings>
But, now I have a reqmt. where cross-environment functionality is to be implemented. What is the best approach to go about this? I could add each of the connection strings in the master app.config by giving it an env specific name, but I feel this might not be the best approach.
So, is there a way to still keep the env specific config files and load all the connection strings across all environments in the master app.config under different namespaces or something to avoid key duplication errors?
Thanks in advance for all the help...
If I understand you right I may recommend you to use default xdt:Transform syntax like in Web.Config/Debug/Release. For app.config files you can use something like this package https://visualstudiogallery.msdn.microsoft.com/7bc82ddf-e51b-4bb4-942f-d76526a922a0

Changing the connection String in App.config after Installing an Application & application should accept the changes mande in config file

Question:
After publish and installed an windows application i would like to change the connection string present in the App.config file ( 3 Tire-Architecture). the changed connection string should be understood by already installed application. How to do it.
I have this App.config content:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="a" connectionString="server=localhost;User Id=root;database=billing"/>
</connectionStrings>
</configuration>
in Form1 ( say ) & I have gridview1, whose datasource will take from above Connection String. Now i want to change it without re-publishing application. How to solve this task ?
You need to create methods to write to app.config and also read from app.config.
Change your data access layer to accept a connection string read from your config file and you are good to go.
There are hundreds of articles on the internet on how to do this.
This will get you started.

connection string issue in web.config of ASP.Net

I am using VSTS 2010 + C# + .Net 4.0 to develop an ASP.Net application using SQL Server 2008 Enterprise as database. I am learning someone else's code. I notice code like this, I am not sure whether the usage is correct and so I come here to ask for advice.
In the code, I see some code like this, I want to know whether using such method to read connection string from web.config is correct?
ConfigurationManager.ConnectionStrings["DBConnectinString"].ConnectionString
and such code is used to read connection string from web.config like below, please notice that connection string is defined outside of system.web section.
<?xml version="1.0"?>
<configuration>
<configSections>
<!--this section is empty-->
</configSections>
<appSettings>
...... content of appSettings
</appSettings>
<connectionStrings>
<add name="DBConnectinString" connectionString="data Source=.;uid=foo;pwd=foo;database=FOODB" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
... ... content of system.web
</system.web>
</configuration>
That is the standard place to define connection strings in web.config, yes.
See this for more info: http://msdn.microsoft.com/en-us/library/ms178411.aspx

Categories