Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Retrieving correct DbConnection object by connection string

I have a connection string being passed to a function, and I need to create a DbConnection based object (i.e. SQLConnection, OracleConnection, OLEDbConnection etc) based on this string.

Is there any inbuilt functionality to do this, or any 3rd party libraries to assist. We are not necessarily building this connection string, so we cannot rely on a format the string is written in to determine its type, and I would prefer not to have to code up all combinations and permutations of possible connection strings

like image 380
johnc Avatar asked Oct 09 '08 00:10

johnc


3 Answers

DbConnection GetConnection(string connStr) {     string providerName = null;     var    csb = new DbConnectionStringBuilder { ConnectionString = connStr };                                                              if (csb.ContainsKey("provider"))      {         providerName = csb["provider"].ToString();     }               else     {         var css = ConfigurationManager             .ConnectionStrings             .Cast<ConnectionStringSettings>()             .FirstOrDefault(x => x.ConnectionString == connStr);         if (css != null) providerName = css.ProviderName;     }                 if (providerName != null)      {         var providerExists = DbProviderFactories             .GetFactoryClasses()             .Rows.Cast<DataRow>()             .Any(r => r[2].Equals(providerName));         if (providerExists)          {             var factory = DbProviderFactories.GetFactory(providerName);             var dbConnection = factory.CreateConnection();                              dbConnection.ConnectionString = connStr;             return dbConnection;         }     }                 return null; } 
like image 172
Mark Cidade Avatar answered Sep 28 '22 00:09

Mark Cidade


if you're using framework 2.0 or above, and you can get them to pass in a second string with the driver class, you can use the dbProviderFactory class to load the driver for you.

DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass);
DbConnection dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = myConnectionString;

Here's an MSDN link to the Factory class: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

like image 43
Eric Tuttleman Avatar answered Sep 27 '22 23:09

Eric Tuttleman


You should be able to parse out the Provider section and pass it into DbProviderFactories.GetFactory which will return a OdbcFactory, OleDbFactory or SqlClientFactory and let you then perform CreateConnection etc.

I'm not sure how this would work with Oracle unless they provide an OracleDbFactory.

like image 35
DamienG Avatar answered Sep 27 '22 22:09

DamienG