Taal

Een DbProviderFactory verkrijgen

Het proces van het verkrijgen van een DbProviderFactory omvat het doorgeven van informatie over een gegevensprovider aan de DbProviderFactories class. Op basis van deze informatie retourneert de GetFactory methode een sterk getypeerde providerfactory. Nadat u zich bijvoorbeeld registreert SqlClientFactory, geeft u Microsoft.Data.SqlClient de naam van de provider GetFactory door. Een andere overload van GetFactory accepteert een DataRow. Zodra u de providerfactory hebt verkregen, kunt u de methoden gebruiken om extra objecten te maken. Enkele van de methoden van een SqlClientFactory omvatten CreateConnection, CreateCommand en CreateDataAdapter.

Notitie

De OracleClientFactory, OdbcFactoryen OleDbFactory klassen bieden ook vergelijkbare functionaliteit.

DbProviderFactories registreren

Installeer het Microsoft.Data.SqlClient NuGet-pakket voordat u de bijbehorende factory registreert.

Voeg in .NET Framework de volgende system.data-sectie toe binnen het configuration-element van het web.config- of app.config-bestand van uw toepassing. Het remove element voorkomt dubbele registraties die zijn overgenomen van een ander configuratiebestand.

<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>

Bij moderne .NET registreren configuratiebestanden geen provider factory's. Voordat u GetFactory aanroept, roept u RegisterFactory(String, DbProviderFactory) aan met Microsoft.Data.SqlClient als providernaam en Instance als factory-exemplaar. RegisterFactory is niet beschikbaar op .NET Framework.

In de volgende voorbeelden wordt de factory in code geregistreerd voor moderne .NET. Gebruik voor .NET Framework de vorige configuratievermelding en laat elke RegisterFactory aanroep weg.

De invariabele providernaam identificeert de onderliggende gegevensprovider. Gebruik dezelfde naam voor factoryzoekopdrachten en het providerName kenmerk van een verbindingsreeks.

Providergegevens ophalen

U kunt informatie over geregistreerde gegevensproviders ophalen met behulp van de GetFactoryClasses methode. Hiermee wordt een benoemde DataTable, DbProviderFactories, geretourneerd die de kolommen bevat die in de volgende tabel worden beschreven. De voorbeeldwaarden komen overeen met de .NET Framework-configuratievermelding die eerder wordt weergegeven. Details van de assemblyversie zijn afhankelijk van het geïnstalleerde pakket.

Kolomvolgorde Kolomnaam Voorbeelduitvoer Beschrijving
0 Name Microsoft SqlClient-Data Provider Leesbare naam voor de gegevensprovider
1 Description Microsoft SqlClient-Data Provider voor SQL Server Leesbare beschrijving van de gegevensprovider
2 InvariantName Microsoft.Data.SqlClient Naam die programmatisch kan worden gebruikt om te verwijzen naar de gegevensprovider
3 AssemblyQualifiedName Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient Assemblygekwalificeerde naam van de factoryklasse

Dit DataTable kan worden gebruikt om een gebruiker in staat te stellen een DataRow tijdens runtime te selecteren. De geselecteerde DataRow kan vervolgens aan de GetFactory methode worden doorgegeven om een sterk getypeerde DbProviderFactory te maken. Een geselecteerde DataRow kan worden doorgegeven aan de GetFactory methode om het gewenste DbProviderFactory object te maken.

De geïnstalleerde Provider Factory-klassen weergeven

In dit voorbeeld ziet u hoe u de GetFactoryClasses methode gebruikt om een DataTable met informatie over de geïnstalleerde providers te retourneren. De code doorloopt elke rij in de DataTable en toont informatie voor elke geïnstalleerde provider in het consolevenster.

    // 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

Toepassingsconfiguratiebestanden gebruiken om fabrieksgegevens op te slaan

Het ontwerppatroon dat wordt gebruikt voor het werken met factory's, omvat het opslaan van provider- en verbindingsreeks informatie in een toepassingsconfiguratiebestand, zoals app.config voor een Windows-toepassing en web.config voor een ASP.NET-toepassing.

Het volgende fragment van het configuratiebestand laat zien hoe u twee benoemde verbindingsreeks s opslaat: 'NorthwindSQL' voor een verbinding met de Northwind-database in SQL Server en 'NorthwindAccess' voor een verbinding met de Northwind-database in Access/Jet. De invariant naam wordt gebruikt voor het providerName kenmerk.

<configuration>
  <connectionStrings>
    <clear/>
    <add name="NorthwindSQL"
     providerName="Microsoft.Data.SqlClient"
     connectionString=
     "Data Source=&lt;server&gt;;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>

Belangrijk

Microsoft raadt u aan de veiligste verificatiestroom te gebruiken die beschikbaar is. Als u verbinding maakt met Azure SQL, is Managed Identities voor Azure-resources de aanbevolen verificatiemethode.

Een verbindingsreeks ophalen op providernaam

Als u een verbinding wilt maken via een providerfactory, geeft u een verbindingsreeks en de naam van de provider op. In dit voorbeeld ziet u hoe u een verbindingsreeks ophaalt uit een toepassingsconfiguratiebestand door de naam van de invariante provider door te geven, zoals Microsoft.Data.SqlClient. De code loopt door de ConnectionStringSettingsCollection heen. Het retourneert de overeenkomende verbindingsreeks bij succes; anders null (Nothingin Visual Basic). Als er meerdere vermeldingen voor een provider zijn, wordt het eerste gevonden item geretourneerd. Zie Verbindingsreeksen en configuratiebestanden voor meer informatie en voorbeelden van het ophalen van verbindingsreeks s uit configuratiebestanden.

Notitie

Er is een verwijzing naar System.Configuration.dll vereist om de code uit te voeren.

// 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 en DbConnection maken

In dit voorbeeld ziet u hoe u een DbProviderFactory- en DbConnection-object maakt door de naam van de invariante provider, zoals Microsoft.Data.SqlClient, en een verbindingsreeks op te geven. Een DbConnection object wordt geretourneerd bij succes; null (Nothing in Visual Basic) bij een fout.

De code verkrijgt de DbProviderFactory door GetFactory aan te roepen. Vervolgens maakt de CreateConnection methode het DbConnection object en wordt de ConnectionString eigenschap ingesteld op de verbindingsreeks.

    // 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

Zie ook