문제

연결 문자열이 함수로 전달되고 있으며이 문자열을 기반으로 DBConnection 기반 객체 (예 : SQLConnection, OracleConnection, OLEDBCONNECTION 등)를 작성해야합니다.

이 작업을 수행 할 수있는 내장 기능 또는 지원할 제 3 자 라이브러리가 있습니까? 우리는 반드시이 연결 문자열을 빌드 할 필요는 없으므로 문자열이 그 유형을 결정하기 위해 쓰여진 형식에 의존 할 수는 없으며 선호하다 가능한 연결 문자열의 모든 조합 및 순열을 코딩 할 필요가 없습니다.

도움이 되었습니까?

해결책

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

다른 팁

프레임 워크 2.0 이상을 사용하고있는 경우 드라이버 클래스와 함께 두 번째 문자열을 전달할 수있는 경우 DBProviderFactory 클래스를 사용하여 드라이버를로드 할 수 있습니다.

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

다음은 공장 수업에 대한 MSDN 링크입니다.http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

제공자 섹션을 구문 분석하고 DBProviderFactories.GetFactory로 전달하여 ODBCFactory, OledBFactory 또는 SQLClientFactory를 반환 한 다음 CreateConnection 등을 수행 할 수 있어야합니다.

oracledbfactory를 제공하지 않는 한 이것이 Oracle과 어떻게 작동하는지 잘 모르겠습니다.

대부분의 연결 문자열 (적어도 .NET 2.0에서)에는 제공되는 ProviderName 속성이 있습니다. 따라서 SQL Connection String은 다음과 같은 공급자 이름을 갖습니다.

providerName="System.Data.SqlClient"

따라서 메소드는 연결 문자열과 제공자 이름을 모두 수락해야하며 DBProviderFactory를 사용할 수 있습니다. Damieng이 언급했듯이.

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