Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Proces uzyskiwania obiektu DbProviderFactory obejmuje przekazywanie informacji o dostawcy danych do DbProviderFactories klasy. Na podstawie tych informacji GetFactory metoda zwraca silnie typizowaną fabrykę dostawcy. Na przykład po zarejestrowaniu SqlClientFactory, przekaż GetFactory nazwę dostawcy Microsoft.Data.SqlClient. Inne przeciążenie przyjmuje element DataRow typu GetFactory. Po uzyskaniu fabryki providera możesz użyć jej metod w celu utworzenia dodatkowych obiektów. Niektóre metody elementu SqlClientFactory to CreateConnection, CreateCommandi CreateDataAdapter.
Uwaga
Klasy OracleClientFactory, OdbcFactoryi OleDbFactory zapewniają również podobne funkcje.
Rejestrowanie elementów DbProviderFactories
Zainstaluj pakiet NuGet Microsoft.Data.SqlClient przed zarejestrowaniem jego fabryki.
W .NET Framework dodaj następującą sekcję system.data wewnątrz elementu configuration w pliku app.config lub web.config aplikacji. Element remove zapobiega duplikowaniu rejestracji dziedziczonych z innego pliku konfiguracji.
<system.data>
<DbProviderFactories>
<remove invariant="Microsoft.Data.SqlClient" />
<add name="Microsoft SqlClient Data Provider"
invariant="Microsoft.Data.SqlClient"
description="Microsoft SqlClient Data Provider for SQL Server"
type="Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient"
/>
</DbProviderFactories>
</system.data>
W nowoczesnym środowisku .NET pliki konfiguracji nie rejestrują fabryk dostawców. Przed wywołaniem GetFactory wywołaj metodę RegisterFactory(String, DbProviderFactory) z Microsoft.Data.SqlClient jako nazwą dostawcy i Instance jako wystąpieniem fabryki.
RegisterFactory nie jest dostępny w .NET Framework.
Poniższe przykłady rejestrują fabrykę w kodzie w nowoczesnym środowisku .NET. W przypadku .NET Framework użyj poprzedniego wpisu konfiguracji i pomiń wszelkie wywołanie RegisterFactory.
Nazwa niezmienna dostawcy identyfikuje źródłowego dostawcę danych. Użyj tej samej nazwy dla wyszukiwań fabryki i atrybutu providerName parametrów połączenia.
Pobieranie informacji o dostawcy
Informacje o zarejestrowanych dostawcach danych można pobrać za pomocą metody GetFactoryClasses. Zwraca DataTable o nazwie DbProviderFactories, które zawiera kolumny opisane w poniższej tabeli. Przykładowe wartości odpowiadają wpisowi konfiguracji platformy .NET Framework pokazanym wcześniej; szczegóły wersji zestawu zależą od zainstalowanego pakietu.
| Porządkowe kolumny | Nazwa kolumny | Przykładowe dane wyjściowe | opis |
|---|---|---|---|
| 0 | Name |
Microsoft SqlClient Dostawca danych | Czytelna nazwa dostawcy danych |
| 1 | Description |
Microsoft SqlClient Dostawca danych for SQL Server | Czytelny opis dostawcy danych |
| 2 | InvariantName |
Microsoft.Data.SqlClient | Nazwa, która może służyć programowo do odwoływania się do dostawcy danych |
| 3 | AssemblyQualifiedName |
Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient | Nazwa klasy kwalifikowana nazwą zestawu fabryki |
Może to DataTable służyć do umożliwienia użytkownikowi wybrania DataRow w czasie wykonywania. Następnie wybraną DataRow można przekazać do metody GetFactory w celu utworzenia silnie typizowanego DbProviderFactory. Wybrany element DataRow można przekazać do metody GetFactory w celu utworzenia żądanego obiektu DbProviderFactory.
Wyświetlanie listy zainstalowanych klas fabryk dostawcy
W tym przykładzie pokazano, jak za pomocą GetFactoryClasses metody zwracać DataTable zawierające informacje o zainstalowanych dostawcach. Kod iteruje przez każdy wiersz w DataTable, wyświetlając informacje dla każdego zainstalowanego dostawcy w oknie konsoli.
// This example assumes a reference to System.Data.Common.
static DataTable GetProviderFactoryClasses()
{
#if !NETFRAMEWORK
DbProviderFactories.RegisterFactory("Microsoft.Data.SqlClient", SqlClientFactory.Instance);
#endif
// 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
#If Not NETFRAMEWORK Then
DbProviderFactories.RegisterFactory("Microsoft.Data.SqlClient", SqlClientFactory.Instance)
#End If
' 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
Używanie plików konfiguracji aplikacji do przechowywania informacji o fabryce
Wzorzec projektowy używany do pracy z fabrykami wiąże się z przechowywaniem informacji o dostawcy i parametrów połączenia w pliku konfiguracji aplikacji, takim jak app.config dla aplikacji systemu Windows i web.config dla aplikacji ASP.NET.
Poniższy fragment pliku konfiguracyjnego pokazuje, jak zapisywać dwa nazwane ciągi połączenia: "NorthwindSQL" dla połączenia z bazą danych Northwind w SQL Server oraz "NorthwindAccess" dla połączenia z bazą danych Northwind w Access/Jet. Nazwa invariant jest używana dla atrybutu providerName .
<configuration>
<connectionStrings>
<clear/>
<add name="NorthwindSQL"
providerName="Microsoft.Data.SqlClient"
connectionString=
"Data Source=<server>;Initial Catalog=Northwind;Integrated Security=true;Encrypt=true"
/>
<add name="NorthwindAccess"
providerName="System.Data.OleDb"
connectionString=
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Northwind.mdb;"
/>
</connectionStrings>
</configuration>
Ważne
Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Jeśli łączysz się z usługą Azure SQL, tożsamości zarządzane dla zasobów platformy Azure to zalecana metoda uwierzytelniania.
Pobieranie parametrów połączenia według nazwy dostawcy
Aby utworzyć połączenie za pośrednictwem fabryki dostawcy, podaj parametry połączenia, a także nazwę dostawcy. W tym przykładzie pokazano, jak pobrać parametry połączenia z pliku konfiguracji aplikacji, przekazując niezmienną nazwę dostawcy, taką jak Microsoft.Data.SqlClient. Kod iteruje za pośrednictwem ConnectionStringSettingsCollection. Zwraca on pasujące parametry połączenia w przypadku powodzenia; w przeciwnym razie null (Nothing w Visual Basic). Jeśli istnieje wiele wpisów dla dostawcy, zwracany jest pierwszy znaleziony. Aby uzyskać więcej informacji i przykłady pobierania parametry połączenia z plików konfiguracji, zobacz Parametry połączenia i pliki konfiguracji.
Uwaga
Odwołanie do System.Configuration.dll jest wymagane w celu uruchomienia kodu.
// 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
Tworzenie elementu DbProviderFactory i DbConnection
W tym przykładzie pokazano, jak utworzyć obiekt DbProviderFactory i obiekt DbConnection przez przekazanie niezmiennej nazwy dostawcy, takiej jak Microsoft.Data.SqlClient, i parametrów połączenia. Obiekt DbConnection jest zwracany po powodzeniu; null (Nothing w Visual Basic) w przypadku dowolnego błędu.
Kod uzyskuje element DbProviderFactory przez wywołanie metody GetFactory. Następnie metoda CreateConnection tworzy obiekt DbConnection i ustawia właściwość ConnectionString na łańcuch połączenia.
// 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
{
#if !NETFRAMEWORK
if (providerName == "Microsoft.Data.SqlClient")
{
DbProviderFactories.RegisterFactory(providerName, SqlClientFactory.Instance);
}
#endif
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
#If Not NETFRAMEWORK Then
DbProviderFactories.RegisterFactory("Microsoft.Data.SqlClient", SqlClientFactory.Instance)
#End If
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