C# Winforms Configuration System


So, there I was the other day, sitting pondering about using Linq in the project I was just about to start on, mulling the pro’s and con’s over in my mind.

Those of you who know me well, will know that I love Linq, it’s simply one of the best technologies that MS has come up with in recent years, but it has one drawback.

The configuration of the database connection strings, when using it in a WinForms project.

Let me explain:

Up until now, everything I did with SQL server in a WinForm app, I did using ADO, and as such my configuration parameters where always stored in the registry.  Using Linq means that you now have to have an extra file with your app in the form of an XML configuration file.

This in itself is not a problem, after all a lot of apps have a lot of supplementary files these days, however in this case the SQL server connection string is held in plain text inside the file, and is easily readable by anyone with access to the computers file system (and yes I know, before I get jumped on or flamed or whatever, if you know how, the registry is easy enough to read).

Anyway, this very reason, and the fact that building a way of allowing the programs user to reconfigure, also meant writing a configuration parser (MS decided to put connection strings in a section of their own, thats not accessible with the normal App.Config API) meant I’ve been reluctant up until now to use Linq in WinForms apps.

Using it in an ASP.NET web app is a different kettle of fish, beacuse the web server config will usually not let you download the Web.Config file, and so the connection strings are generally only accessible to those with authorised and/or physical access to the server itself.

So, hence I was pondering…   Linq would make the program easier to develop, but I didn’t want visible connection strings in a file in "Program Files", then as I was browsing through a DBML file generated by Visual Studio, I noticed that there was 2 constructors for the Data Context class to create the Linq Classes.

After further investigation, it turns out that this second constructor (there’s actually more than 2) takes a string as it’s parameter, and more so, this parameter can be…   yup you guessed it a full connection string.

It was decided…  Linq in Winforms it was, and so the configuration system I present here was born.

The project (Which can be downloaded here) builds a dll called "configSystem", this DLL exposes a class and a number of methods to make configuration of database parameters really easy, and even includes a routine to search the local network for instances of MS-SQL server.

Because of the SQL server routines, it will only run on a machine that has the MS-SQL Server management objects installed in the GAC, but if you have Server management studio installed (or any other SMO based client utils), then they will be there.

Iv’e tried to make the project as easy to use as possible, to use it, add the DLL as a reference, then at the top of your file add a

using configSystem;

line.  Once you do this, you can then make use of the library as follows:

In your apps main initialisation function…

private configForm myConfig = new configForm();
private configSettings mySettings = new configSettings();

// Public form constructor
public frmMainForm()
{
  // VS generated form/component initialisation
  InitializeComponent();

  // Set the default app and company key, this will eventually generate:
  // HKEY_CURRENT_USERSoftware<DefaultCompany><DefaultAppName>
  //
  myConfig.setDefaultCompany("My-Company");
  myConfig.setDefaultAppname("My-App");

  // Override config system defaults.  If no config exsists, these values
  // will be used to populate the form with sensible values.
  myConfig.setDefaultDatabase("MyDatabase");
  myConfig.setDefaultUser("user");
  myConfig.setDefaultPassword("password");

  // Initialise the config system, and if need be show the config dialog
  // to create one.
  if (!myConfig.checkConfig())
  {
    myConfig.setInstructions(configForm.instructionTypes.Invalid);
    myConfig.ShowDialog();
  }

  // Populate the mySettings structure with the set values.
  mySettings = myConfig.configuredSettings;
}

This will check if a config exsists, and if not popup the config dialog, which will attempt to auto populate with SQL server instances (hence the delay after calling it ;-)   ), if the dialog is popped up, the cancel button is disabled, beacuse this is a required step to create a config.

If a config exists, then the dialog is not shown, and the settings are read into ‘MySettings’ where they can be retrieved as needed.

To provide a button on the form to allow re-configuration, simply add the following to the buttons click handler:

// Set config dialog instructions as required
myConfig.setInstructions(configForm.instructionTypes.Normal);

// Show the config dialog
myConfig.ShowDialog();

// Synch the settings in case any where changed.
myConfig.reloadConfig();
mySettings = myConfig.configuredSettings;

and this will change and reload the config into the application.

Last but not least however, comes the bit that’s in there for you Linq users :-)

When you create your data context objects, simply use:

mydatabaseDataContext dc = new mydatabaseDataContext(myConfig.connectionString);

and all will be performed automagicly.

Unfortunately, the app will still need the XML config file, as the Linq system will try to load it at app start, however just do what I did and clear out anything in the actual string itself, so all your left with is connectionstring="" in your XML.

Your app will still work, but no default opening of DB’s will take place, well not unless you try to use the default datacontext constructor anyway ;-)

Have fun, and enjoy.  If you use it in your projects, then a "This was written by Shawty of Digital Solutions UK" notice , or thanks would be appreciated, and a quick contact to let me know where it’s been used, but other than that I’m not tying any specific licence to it, if you improve it I would also appreciate you sending me an updated copy, but again I’m not going to hold you to that.

The project files are on my MSN Skydrive HERE

Happy Linqing

Shawty

About these ads

2 thoughts on “C# Winforms Configuration System

  1. Peter – nice article. But I don’t understand what you’re getting from this class you’ve made. Why not just store the connection string in the registry (if that’s what you want to do), and pass it in to the data context that way – why the fiddling around with the config file? I don’t understand :-)P.S. Careful….. "Linq" != "Linq to Sql".

  2. Hi Isaac, thanks for the comments :-)I agree, that normally you would just store the connection string in a resource/string table etc., but in the case of the project that I wrote this for, I had to provide the capability of changing the database server on the fly by the end user.If you examine the class you’ll see it has a little pop up winform, that can be used to manage the parameters, which it then automaticly persists to the system registry.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s