DbProviderFactory 가져오기
DbProviderFactory를 가져오는 프로세스에서는 데이터 공급자에 대한 정보가 DbProviderFactories 클래스에 전달됩니다. GetFactory 메서드는 이 정보를 기반으로 하여 강력한 형식의 공급자 팩터리를 만듭니다. 예를 들어 SqlClientFactory를 만들려면 공급자 이름을 "System.Data.SqlClient"로 지정하는 문자열을 GetFactory
에 전달합니다. GetFactory
의 다른 오버로드는 DataRow를 사용합니다. 공급자 팩터리를 만든 후에는 해당 메서드를 사용하여 다른 개체를 만들 수 있습니다. SqlClientFactory
의 메서드로는 CreateConnection, CreateCommand 및 CreateDataAdapter가 있습니다.
참고 항목
OracleClientFactory, OdbcFactory 및 OleDbFactory 클래스도 이와 유사한 기능을 제공합니다.
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를 선택할 수 있습니다. 그런 다음 선택한 DataRow
를 GetFactory 메서드에 전달하여 강력한 형식의 DbProviderFactory를 만들 수 있습니다. 선택한 DataRow를 GetFactory
메서드에 전달하면 원하는 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>
Important
사용 가능한 가장 안전한 인증 흐름을 사용하는 것이 권장됩니다. Azure SQL에 연결하려는 경우, 권장되는 인증 방법은 Azure 리소스에 대한 관리 ID입니다.
공급자 이름을 사용하여 연결 문자열 검색하기
공급자 팩터리를 만들려면 연결 문자열뿐만 아니라 공급자 이름도 제공해야 합니다. 이 예에서는 "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" 형식의 공급자 이름과 연결 문자열을 전달하여 DbProviderFactory 및 DbConnection 개체를 만드는 방법을 보여 줍니다. 메서드가 성공하면 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