C# 연결 문자열별로 올바른 dbconnection 객체를 검색합니다
-
06-07-2019 - |
문제
연결 문자열이 함수로 전달되고 있으며이 문자열을 기반으로 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이 언급했듯이.