views:

36

answers:

3

I have a c# assembly that uses the app.config to store its database connection string. When debugging the application I noticed that the connection to the database kept failing because the ConfigurationManager kept returning the machine.config connection string:

data source=.\SQLEXPRESS; Integrated Security;....

I added <clear/> before my connection string in the app.config and it fixed the issue on my dev machine. The problem returned when I deployed it to production. Can someone tell me how I can stop the machine.config connection string from being used?

SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[0].ConnectionString);

<connectionStrings>
    <clear/>
    <add name="VersionConnectionString"
     connectionString=" Data Source=localhost;Initial Catalog=VersionInfo;User ID=user;Password=password"         
     providerName="System.Data.SqlClient" />
  </connectionStrings>

UPDATE

The following still gives me the machine.config connection string?!

 Configuration appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
                string dllConfigData =
                    appConfig.ConnectionStrings.ConnectionStrings[0].ConnectionString;

Thanks!

+1  A: 

Try getting an instance of your app.config file as a Configuration object:

var config = ConfigurationManager.OpenExeConfig(ConfigurationUserLevel.None);

var myConnString = config.ConnectionStrings["VersionConnectionString"].ConnectionString;

This bypasses the machine config file completely.

KeithS
This is a class library (.dll) OpenExeConfig throws and exception. Good idea though.
Nick
A: 

You should be getting your connection string by NAME instead of INDEX - that will ensure you're getting what you're asking for.

Try

SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["VersionConnectionString"].ConnectionString);
roman m
Typically I would agree. This does not make a difference in this case.
Nick
you get your machine.config connection string when you get it by name?
roman m
Yeah.. I updated the question. Very strange.
Nick
A: 

When using connection strings in a DLL, you need to add them to your exe's app.config as well, using the exact same name for the setting. Then, you can change the connection string in the exe's .config file and the DLL will pick it up automatically when loaded.

This is probably the only way you can have working custom connection strings in the app.config file when your DB persistence layer is implemented in a separate DLL. Don't even ask me how much time it took me to research and debug this.

Alan