2012-09-01 3 views
0

ADO.Net에서 SqlConnection 개체를 인스턴스화하면 해당 코드에서 DbProviderFactory 코드가 실행됩니까? 따라서 블록 2의 코드가에 의해 실행될 때, 실제로 블록 1에서 코드를 실행하게됩니다. 그러나 이것이 사실인지 확실하지 않습니다.DbProviderFactory ADO.Net에서 SqlConnection을 만들기위한 코드와의 코드 관계

코드 블록 (1) - 사용도록 SqlConnection의 인스턴스를 DbProviderFactory 접근

DbProviderFactory factory = 
DbProviderFactories.GetFactory(providerName); 

connection = factory.CreateConnection(); 
connection.ConnectionString = connectionString; 

코드 BLOCK 2 -Instantiate 내가보고했다

SqlConnection con = new SqlConnection(connectionString); 
+0

나는 그 질문이 무엇인지 잘 모르겠습니다. 생산 된 일리노이 (실제로 반영되었을 때)가 실제로 블록 1처럼 보이는지 묻고 있습니까? –

+0

IL이 아닙니다. 내 말은, 배후에있는 경우 실제로 실행되는 코드는 해당 DbFactory 코드입니다. – Sunil

답변

3

표준 ADO.Net 코드를 사용도록 SqlConnection 일부 에서 .net Framework 어셈블리 및 다음을 찾았습니다

DbProviderFactories.GetFactory(providerName)은 제공된 제공자 이름에 따라 에 따라 팩토리 객체를 반환합니다. 공급자 이름이 인 SQL 제공자를 나타내므로 SqlClientFactory이 표시됩니다.

factory.CreateConnection()이 호출됩니다. 이 경우 SqlClientFactory.CreateConnection()는 내가 질문에 대답은 팩토리 메소드를 호출하면 공급자의 방법을 특정 클래스 및 원형이 아닌 다른 방법을 호출 할 것입니다 생각

public override DbConnection CreateConnection() 
{ 
    return new SqlConnection(); 
} 

로 구현됩니다 호출됩니다 !

+0

SqlConnection에 대한 디 컴파일 된 코드를 살펴보고 SqlConnection을 호출하면 DbPRoviderFactory가 만들어지는 것으로 보입니다. 그래서 장면 뒤에서 DbProvider 클래스가 호출 될 수 있습니다. 그러나 아직도 확실하지 않습니다. – Sunil

+0

나는 그렇게 생각하지 않는다. SqlConnection의 정적 ctor 내에는 SqlConnectionFactory가 있지만 _connectionFactory를 호출하는 sqlConnection 내의 인스턴스 관련 코드의 코드 줄을 볼 수 없습니다. 어쨌든 SqlClientFactory는 SqlConnection의 생성자를 호출하므로 SqlConnection이 SqlClientFactory를 호출하면 끝이없는 자체 호출이됩니다! –

+0

_connectionFactory가 SqlConnection 생성자에서 무엇인가하지 않습니까? 이 팩토리는 DbProviderFactory의 인스턴스입니다. 이것은 DbProvider 팩토리가 어떻게 든 사용되고 있다는 것을 의미합니까? – Sunil

2

무슨 일이 일어나는지 확인하려면 코드 블록 2를 제거하는 것이 좋습니다. 필요하지 않으며 복잡성이 추가됩니다. 그냥 공장 기능을 사용하여 연결을 사용하십시오. 예를 들어, 당신은 :

try 
{ 
    connection.Open(); 
    var command = connection.CreateCommand(); 
    command.CommandText = "SELECT * FROM mytable"; 
    (..etc...) 

우리는 사용자 환경에 따라, MS SQL 또는 Oracle에 연결했고,이, 우리를 위해 완벽하게 유일한 고유의 뜻을했다 :

DbProviderFactory factory = 
DbProviderFactories.GetFactory(providerName); 

connection = factory.CreateConnection(); 
connection.ConnectionString = connectionString; 

다음 추가 공급자, 연결 문자열 및 명령 텍스트 일 ​​수 있습니다. Microsoft는 machine.config here에서 공급자를 가져 오는 방법의 예를 보여줍니다.

호프가 도움이 되었기를 바랍니다. 내가 틀렸다면 알려주세요!