Share via


DbProviderFactory 가져오기

DbProviderFactory를 가져오는 프로세스에서는 데이터 공급자에 대한 정보가 DbProviderFactories 클래스에 전달됩니다. GetFactory 메서드는 이 정보를 기반으로 하여 강력한 형식의 공급자 팩터리를 만듭니다. 예를 들어 SqlClientFactory를 만들려면 공급자 이름을 "System.Data.SqlClient"로 지정하는 문자열을 GetFactory에 전달합니다. GetFactory의 다른 오버로드는 DataRow를 사용합니다. 공급자 팩터리를 만든 후에는 해당 메서드를 사용하여 다른 개체를 만들 수 있습니다. SqlClientFactory의 메서드로는 CreateConnection, CreateCommandCreateDataAdapter가 있습니다.

참고 항목

.NET Framework OracleClientFactory, OdbcFactoryOleDbFactory 클래스도 이와 유사한 기능을 제공합니다.

DbProviderFactories 등록

팩터리 기반의 클래스를 지원하는 각 .NET Framework 데이터 공급자는 로컬 컴퓨터에 있는 machine.config 파일의DbProviderFactories 섹션에 구성 정보를 등록합니다. 다음 구성 파일 조각에서는 System.Data.SqlClient의 구문과 형식을 보여 줍니다.

<system.data>  
  <DbProviderFactories>  
    <add name="SqlClient Data Provider"  
     invariant="System.Data.SqlClient"
     description=".Net Framework Data Provider for SqlServer"
     type="System.Data.SqlClient.SqlClientFactory, System.Data,
     Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"  
    />  
  </DbProviderFactories>  
</system.data>  

invariant 특성은 기본 데이터 공급자를 식별합니다. 세 부분으로 이루어진 이 명명 구문은 새 팩터리를 만들 때뿐만 아니라 공급자 이름 및 관련된 연결 문자열을 런타임에 검색할 수 있도록 애플리케이션 구성 파일에서 공급자를 식별하는 데도 사용됩니다.

공급자 정보 검색

GetFactoryClasses 메서드를 사용하면 로컬 컴퓨터에 설치되어 있는 데이터 공급자에 대한 모든 정보를 검색할 수 있습니다. 이 메서드는 다음 표에 설명된 열을 포함하는 DbProviderFactories라는 DataTable을 반환합니다.

열 서수 열 이름 예제 출력 설명
0 이름 SqlClient Data Provider 읽을 수 있는 데이터 공급자 이름
1 설명 .Net Framework Data Provider for SqlServer 읽을 수 있는 데이터 공급자 설명
2 InvariantName System.Data.SqlClient 데이터 공급자를 프로그래밍 방식으로 참조하는 데 사용할 수 있는 이름
3 AssemblyQualifiedName System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 개체를 인스턴스화하는 데 충분한 정보가 포함된 팩터리 클래스의 정규화된 이름

DataTable을 사용하면 런타임에 사용자가 DataRow를 선택할 수 있습니다. 그런 다음 선택한 DataRowGetFactory 메서드에 전달하여 강력한 형식의 DbProviderFactory를 만들 수 있습니다. 선택한 DataRowGetFactory 메서드에 전달하면 원하는 DbProviderFactory 개체를 만들 수 있습니다.

설치되어 있는 공급자 팩터리 클래스 나열

이 예제에서는 GetFactoryClasses 메서드를 사용하여 설치되어 있는 공급자에 대한 정보가 포함된 DataTable을 반환하는 방법을 설명합니다. 이 코드는 DataTable의 각 행을 반복하여 현재 설치되어 있는 각 공급자에 대한 정보를 콘솔 창에 표시합니다.

// This example assumes a reference to System.Data.Common.
static DataTable GetProviderFactoryClasses()
{
    // Retrieve the installed providers and factories.
    DataTable table = DbProviderFactories.GetFactoryClasses();

    // Display each row and column value.
    foreach (DataRow row in table.Rows)
    {
        foreach (DataColumn column in table.Columns)
        {
            Console.WriteLine(row[column]);
        }
    }
    return table;
}
' This example assumes a reference to System.Data.Common.
Private Shared Function GetProviderFactoryClasses() As DataTable

    ' Retrieve the installed providers and factories.
    Dim table As DataTable = DbProviderFactories.GetFactoryClasses()

    ' Display each row and column value.
    Dim row As DataRow
    Dim column As DataColumn
    For Each row In table.Rows
        For Each column In table.Columns
            Console.WriteLine(row(column))
        Next
    Next

    Return table
End Function

애플리케이션 구성 파일을 사용하여 팩터리 정보 저장

팩터리로 작업하는 데 사용되는 디자인 패턴에는 공급자 및 연결 문자열 정보를 app.config(Windows 애플리케이션) 및 web.config(ASP.NET 애플리케이션)와 같은 애플리케이션 구성 파일에 저장하는 작업이 포함됩니다.

다음 구성 파일 조각에서는 SQL Server에서 Northwind 데이터베이스에 연결하는 데 필요한 "NorthwindSQL" 및 Access/Jet에서 Northwind 데이터베이스에 연결하는 데 필요한 "NorthwindAccess"라는 두 가지 명명된 연결 문자열을 저장하는 방법을 보여 줍니다. providerName 특성에는 invariant 이름이 사용됩니다.

<configuration>  
  <connectionStrings>  
    <clear/>  
    <add name="NorthwindSQL"
     providerName="System.Data.SqlClient"
     connectionString=  
     "Data Source=MSSQL1;Initial Catalog=Northwind;Integrated Security=true"  
    />  
  
    <add name="NorthwindAccess"
     providerName="System.Data.OleDb"
     connectionString=  
     "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Northwind.mdb;"  
    />  
  </connectionStrings>  
</configuration>  

공급자 이름을 사용하여 연결 문자열 검색

공급자 팩터리를 만들려면 연결 문자열뿐만 아니라 공급자 이름도 제공해야 합니다. 이 예에서는 "System.Data.ProviderName"이라는 고정 형식으로 공급자 이름을 전달하여 애플리케이션 구성 파일에서 연결 문자열을 검색하는 방법을 보여 줍니다. 이 코드는 ConnectionStringSettingsCollection을 반복합니다. 메서드가 성공하면 ProviderName이 반환되고, 그렇지 않으면 null(Visual Basic의 경우에는 Nothing)이 반환됩니다. 공급자에 대한 항목이 여러 개 있으면 응용 프로그램 구성 파일에서 찾은 첫 번째 항목이 반환됩니다. 구성 파일에서 연결 문자열 검색에 대한 자세한 내용과 예는 연결 문자열 및 구성 파일을 참조하세요.

참고 항목

코드를 실행하려면 System.Configuration.dll에 대한 참조가 필요합니다.

// Retrieve a connection string by specifying the providerName.
// Assumes one connection string per provider in the config file.
static string? GetConnectionStringByProvider(string providerName)
{
    // Get the collection of connection strings.
    ConnectionStringSettingsCollection? settings =
        ConfigurationManager.ConnectionStrings;

    // Walk through the collection and return the first
    // connection string matching the providerName.
    if (settings != null)
    {
        foreach (ConnectionStringSettings cs in settings)
        {
            if (cs.ProviderName == providerName)
            {
                return cs.ConnectionString;
            }
        }
    }
    return null;
}
' Retrieve a connection string by specifying the providerName.
' Assumes one connection string per provider in the config file.
Private Shared Function GetConnectionStringByProvider( _
    ByVal providerName As String) As String

    'Return Nothing on failure.
    Dim returnValue As String = Nothing

    ' Get the collection of connection strings.
    Dim settings As ConnectionStringSettingsCollection = _
        ConfigurationManager.ConnectionStrings

    ' Walk through the collection and return the first 
    ' connection string matching the providerName.
    If Not settings Is Nothing Then
        For Each cs As ConnectionStringSettings In settings
            If cs.ProviderName = providerName Then
                returnValue = cs.ConnectionString
                Exit For
            End If
        Next
    End If

    Return returnValue
End Function

DbProviderFactory 및 DbConnection 만들기

이 예에서는 "System.Data.ProviderName" 형식의 공급자 이름과 연결 문자열을 전달하여 DbProviderFactoryDbConnection 개체를 만드는 방법을 보여 줍니다. 메서드가 성공하면 DbConnection 개체가 반환되고, 오류가 발생하면 null (Visual Basic의 경우에는 Nothing)이 반환됩니다.

이 코드는 DbProviderFactory를 호출하여 GetFactory를 가져옵니다. 그러면 CreateConnection 메서드가 DbConnection 개체를 만들고 ConnectionString 속성이 연결 문자열에 설정됩니다.

// Given a provider name and connection string,
// create the DbProviderFactory and DbConnection.
// Returns a DbConnection on success; null on failure.
static DbConnection CreateDbConnection(
    string providerName, string connectionString)
{
    // Assume failure.
    DbConnection connection = null;

    // Create the DbProviderFactory and DbConnection.
    if (connectionString != null)
    {
        try
        {
            DbProviderFactory factory =
                DbProviderFactories.GetFactory(providerName);

            connection = factory.CreateConnection();
            connection.ConnectionString = connectionString;
        }
        catch (Exception ex)
        {
            // Set the connection to null if it was created.
            if (connection != null)
            {
                connection = null;
            }
            Console.WriteLine(ex.Message);
        }
    }
    // Return the connection.
    return connection;
}
' Given a provider, create a DbProviderFactory and DbConnection.
' Returns a DbConnection on success; Nothing on failure.
Private Shared Function CreateDbConnection( _
    ByVal providerName As String, ByVal connectionString As String) _
    As DbConnection

    ' Assume failure.
    Dim connection As DbConnection = Nothing

    ' Create the DbProviderFactory and DbConnection.
    If Not connectionString Is Nothing Then
        Try
            Dim factory As DbProviderFactory = _
               DbProviderFactories.GetFactory(providerName)

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

        Catch ex As Exception
            ' Set the connection to Nothing if it was created.
            If Not connection Is Nothing Then
                connection = Nothing
            End If
            Console.WriteLine(ex.Message)
        End Try
    End If

    ' Return the connection.
    Return connection
End Function

참고 항목