Pergunta

Eu tenho uma string de conexão que está sendo passada para uma função e preciso criar um objeto baseado em dbConnection (ou seja, sqlConnection, oracleConnection, OLEDBConnection etc) com base nessa sequência.

Existe alguma funcionalidade embutida para fazer isso ou quaisquer bibliotecas de terceiros para ajudar. Não estamos necessariamente construindo essa string de conexão, por isso não podemos confiar em um formato em que a string está escrita para determinar seu tipo, e eu faria preferir não ter que codificar todas as combinações e permutações de possíveis seqüências de conexão

Foi útil?

Solução

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

Outras dicas

Se você estiver usando a estrutura 2.0 ou superior e poderá fazer com que eles passem em uma segunda sequência com a classe Driver, poderá usar a classe DBProviderFactory para carregar o driver para você.

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

Aqui está um link do MSDN para a aula de fábrica:http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

Você deve analisar a seção do provedor e passá -la para o dbProviderFacories.GetFactory, que retornará um odbcFactory, OLEDBFactory ou SQLClientFactory e permitirá que você execute o CreateConnection etc.

Não tenho certeza de como isso funcionaria com o Oracle, a menos que eles forneçam um OracledBFactory.

A maioria das cadeias de conexão (pelo menos no .NET 2.0) também possui uma propriedade de nome de providências que acompanha eles. Portanto, uma string de conexão SQL terá um nome de provedor como:

providerName="System.Data.SqlClient"

Portanto, seu método precisaria aceitar a sequência de conexão e o nome do provedor e você pode usar o DBProviderFactory Como mencionado por Damieng.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top