2008-10-09 4 views
20

함수에 전달되는 연결 문자열이 있는데이 문자열을 기반으로 DbConnection 기반 개체 (즉, SQLConnection, OracleConnection, OLEDbConnection 등)를 만들어야합니다.C# 연결 문자열로 올바른 DbConnection 개체 검색

이 작업을 수행 할 수있는 inbuilt 기능 또는 지원할 타사 라이브러리가 있습니까? 우리는이 연결 문자열을 반드시 만들 필요가 없으므로 형식을 결정하기 위해 문자열을 쓰는 형식에 의존 할 수 없습니다. 은 가능한 연결 문자열의 모든 조합과 순열을 코드화하지 않아도됩니다.

답변

29
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; 
    } 
+0

나는 또한 같은은 OleDb 연결 문자열에 대한 먹힐 생각하지 않습니다 : 공급자 = Microsoft.ACE.OLEDB.12.0; 데이터 소스 = 9cb8a4c4-9661-4c10-a21c-fb4a85ce2471.xlsx; 모드 = 읽기 쓰기를; 확장 속성 = "Excel 12.0 Xml; HDR = 예; IMEX = 0;" –

+0

아니요, 공급자가 "System.Data.OleDb"로 지정되거나 연결 문자열이 구성에 지정된 경우 OLEDB 연결 만 반환합니다. –

+0

정말 놀랍습니다. 이런 종류의 번거 로움없이 코드를 DB 독립적으로 만들 수는 없습니다. –

1

Provider 섹션을 파싱하여 DbProviderFactories.GetFactory로 전달하여 OdbcFactory, OleDbFactory 또는 SqlClientFactory를 반환하고 CreateConnection 등을 수행 할 수있게해야합니다.

오라클에서 어떻게 작동하는지 잘 모르겠습니다. OracleDbFactory를 제공합니다.

18

프레임 워크 2.0 이상을 사용하고 있고 드라이버 클래스를 사용하여 두 번째 문자열을 전달할 수있는 경우 dbProviderFactory 클래스를 사용하여 드라이버를로드 할 수 있습니다. (적어도 .NET 2.0) http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

1

대부분의 연결 문자열도 그들과 함께가는 ProviderName 속성이 있습니다

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

다음은 공장 클래스에 대한 MSDN 링크입니다. 그래서 SQL 연결 문자열은 같은 공급 업체의 이름이있을 것이다 :

providerName="System.Data.SqlClient" 

그래서 방법은 연결 문자열과 공급자 이름을 모두 수용해야하고 당신이 DbProviderFactory as mentioned by damieng 사용할 수 있습니다.