문제

a를 기반으로 DBConnection을 어떻게 구성합니까? 제공자 이름?

견본 제공자 이름에스

  • System.data.sqlclient
  • System.Data.OLEDB
  • System.Data.ODBC
  • Firebirdsql.data.firebirdclient

IIS 서버의 web.config 파일에 연결 문자열이 저장되어 있습니다.

<connectionStrings>
  <add name="development"
        connectionString="Provider = IBMDA400; Data Source = MY_SYSTEM_NAME; User Id = myUsername; Password = myPassword;" 
        providerName="System.Data.OleDb" />
  <add name="live" 
        connectionString="usd=sa;pwd=password;server=deathstar;" 
        providerName="System.Data.Odbc" />
  <add name="testing" 
        connectionString="usd=sa;pwd=password;server=deathstar;" 
        providerName="System.Data.SqlClient" />
  <add name="offline"
        connectionString="Server=localhost;User=SYSDBA;Password=masterkey;Charser=NONE;Database=c:\data\mydb.fdb"
        providerName="FirebirdSql.Data.FirebirdClient"/>

당신은 그들이 모두 다른 공급자를 사용하는 것을 볼 수 있습니다. 연결을 만들 때가되면 어떤 종류의 DBConnection을 만들 었는지 알아야합니다.

  • sqlconnection
  • OLEDBCONNECTION
  • ODBCConnection
  • fbconnection

ConnectionStrings 항목에는 a가 포함됩니다 ProviderName, 그러나 이것들은 DBConnection Descendant 클래스의 이름이 아니지만 네임 스페이스

문자열을 기반으로 DBConnection을 구성하는 방법 ProviderName?


public DbConnection GetConnection(String connectionName)
{
    //Get the connectionString infomation
    ConnectionStringSettings cs = 
          ConfigurationManager.ConnectionStrings[connectionName];
    if (cs == null)
       throw new ConfigurationException("Invalid connection name \""+connectionName+"\");

    //Create a connection based on the provider
    DbConnection conn = new DbConnection();

}
도움이 되었습니까?

해결책

이 경로로 이동하면 DBProviderFactories 클래스를 사용하여 연결을 구성하는 데 사용할 수있는 DBProviderFactory를 얻으려고합니다. 나는이 코드를 시도하지 않았지만 그것이 효과가 있다고 생각합니다. DBProviderFactories 클래스의 getFactoryClasses 메소드를 사용하여 제공자 이름을 찾아서 불리 이름을 사용해야 할 수도 있습니다.

public DbConnection GetConnection(String connectionName)
{
   //Get the connection string info from web.config
   ConnectionStringSettings cs= 
         ConfigurationManager.ConnectionStrings[connectionName];

   //documented to return null if it couldn't be found
   if (cs == null)
      throw new ConfigurationErrorsException("Invalid connection name \""+connectionName+"\"");

   //Get the factory for the given provider (e.g. "System.Data.SqlClient")
   DbProviderFactory factory = 
         DbProviderFactories.GetFactory(cs.ProviderName);

   //Undefined behaviour if GetFactory couldn't find a provider.
   //Defensive test for null factory anyway
   if (factory == null)
      throw new Exception("Could not obtain factory for provider \""+cs.ProviderName+"\"");

   //Have the factory give us the right connection object      
   DbConnection conn = factory.CreateConnection();

   //Undefined behaviour if CreateConnection failed
   //Defensive test for null connection anyway
   if (conn == null)
      throw new Exception("Could not obtain connection from factory");

   //Knowing the connection string, open the connection
   conn.ConnectionString = cs.ConnectionString;
   conn.Open()

   return conn;
}

다른 팁

체크 아웃 이 Hanselman 블로그 다른 연결 문자열 이름에 맞춤형 빌드 유형을 추가 할 때는 공급자 유형을 사용하는 것과 다른 방식으로 달성하려는 것들에 맞는 것처럼 보입니다.

특정 연결 이름 (dev, test, prod)의 ProviderName이 변경되지 않은 경우 메소드의 ConnectionName Param을 켜고 ProviderName 인스턴스를 그렇게 설정할 수없는 이유는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top