Abrufen einer "DbProviderFactory"

Der Prozess des Abrufens einer DbProviderFactory beinhaltet die Übergabe von Informationen zu einem Datenanbieter an die DbProviderFactories-Klasse. Auf der Grundlage dieser Informationen erstellt die GetFactory-Methode eine stark typisierte Anbieterfactory. So können Sie z. B. zum Erstellen einer SqlClientFactoryGetFactory eine Zeichenfolge übergeben, in der als Anbietername "System.Data.SqlClient" angegeben ist. Die andere Überladung von GetFactory verwendet eine DataRow. Nach dem Erstellen der Anbieterfactory können Sie deren Methoden zum Erstellen zusätzlicher Objekte verwenden. Zu den Methoden einer SqlClientFactory gehören u. a. CreateConnection, CreateCommand und CreateDataAdapter.

Hinweis

Die .NET Framework-Klassen OracleClientFactory, OdbcFactory und OleDbFactory bieten die gleiche Funktionalität.

Registrieren von "DbProviderFactories"

Jeder .NET Framework-Datenanbieter, der eine factorybasierte Klasse unterstützt, registriert die Konfigurationsinformationen im DbProviderFactories-Abschnitt der Datei machine.config auf dem lokalen Computer. Das folgende Konfigurationsdateifragment zeigt die Syntax und das Format für 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>  

Das invariant-Attribut identifiziert den zugrunde liegenden Datenanbieter. Diese dreiteilige Benennungssyntax wird auch zum Erstellen einer neuen Factory und zum Identifizieren des Anbieters in einer Anwendungskonfigurationsdatei verwendet, sodass der Anbietername und die damit verknüpfte Verbindungszeichenfolge zur Laufzeit abgerufen werden können.

Abrufen von Anbieterinformationen

Zum Abrufen von Informationen zu allen auf dem lokalen Computer installierten Datenanbietern können Sie die GetFactoryClasses-Methode verwenden. Sie gibt eine DataTable mit dem Namen DbProviderFactories zurück, die die in der folgenden Tabelle beschriebenen Spalten enthält.

Spaltenordinalzahl Spaltenname Beispielausgabe BESCHREIBUNG
0 Name SqlClient Data Provider Lesbarer Name des Datenanbieters
1 Beschreibung .Net Framework Data Provider for SqlServer Lesbare Beschreibung des Datenanbieters
2 InvariantName System.Data.SqlClient Name, der für programmgesteuerte Verweise auf den Datenanbieter verwendet werden können
3 AssemblyQualifiedName System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Voll qualifizierter Name der Factoryklasse, die genügend Informationen zum Instanziieren des Objekts enthält

Diese DataTable kann verwendet werden, um den Benutzer in die Lage zu versetzen, zur Laufzeit eine DataRow auszuwählen. Die ausgewählte DataRow kann dann an die GetFactory-Methode übergeben werden, um eine stark typisierte DbProviderFactory zu erstellen. Eine ausgewählte DataRow kann an die GetFactory-Methode übergeben werden, um das gewünschte DbProviderFactory-Objekt zu erstellen.

Auflisten der installierten Anbieterfactoryklassen

Dieses Beispiel zeigt, wie Sie mit der GetFactoryClasses-Methode eine DataTable mit Informationen zu den installierten Anbietern zurückgeben können. Der Code durchläuft jede Zeile in der DataTable und zeigt im Konsolenfenster die Informationen zu den einzelnen installierten Anbietern an.

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

Verwenden von Anwendungskonfigurationsdateien zum Speichern von Factoryinformationen

Das zum Arbeiten mit Factorys verwendete Entwurfsmuster erlaubt das Speichern von Anbieter- und Verbindungszeichenfolgeninformationen in einer Anwendungskonfigurationsdatei, z. B. in app.config für Windows-Anwendungen und web.config für ASP.NET-Anwendungen.

Das folgende Konfigurationsdateifragment zeigt, wie zwei benannte Verbindungszeichenfolgen, <legacyBold>NorthwindSQL</legacyBold> für eine Verbindung mit der <legacyBold>Northwind</legacyBold>-Datenbank in SQL Server und <legacyBold>NorthwindAccess</legacyBold> für eine Verbindung mit der <legacyBold>Northwind</legacyBold>-Datenbank in Access/Jet, gespeichert werden können. Für das providerName-Attribut wird der invariant-Name verwendet.

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

Abrufen einer Verbindungszeichenfolge nach Anbietername

Zum Erstellen einer Anbieterfactory müssen Sie sowohl eine Verbindungszeichenfolge als auch den Anbieternamen bereitstellen. In diesem Beispiel wird gezeigt, wie durch Übergabe des Anbieternamens im unveränderlichen Format System.Data.ProviderName eine Verbindungszeichenfolge aus einer Anwendungskonfigurationsdatei abgerufen werden kann. Der Code durchläuft die ConnectionStringSettingsCollection. Im Erfolgsfall gibt er den ProviderName zurück, anderenfalls null (Nothing in Visual Basic). Wenn es für einen Anbieter mehrere Einträge gibt, wird der erste gefundene Eintrag zurückgegeben. Weitere Informationen und Beispiele zum Abrufen von Verbindungszeichenfolgen aus Konfigurationsdateien finden Sie unter Verbindungszeichenfolgen und Konfigurationsdateien.

Hinweis

Zum Ausführen des Codes ist ein Verweis auf System.Configuration.dll erforderlich.

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

Erstellen der "DbProviderFactory" und der "DbConnection"

In diesem Beispiel wird gezeigt, wie ein DbProviderFactory- und ein DbConnection-Objekt erstellt werden kann, indem ihm der Anbietername im Format System.Data.ProviderName und eine Verbindungszeichenfolge übergeben werden. Im Erfolgsfall wird ein DbConnection-Objekt zurückgegeben, anderenfalls null (Nothing in Visual Basic).

Der Code ruft die DbProviderFactory ab, indem er GetFactory aufruft. Dann erstellt die CreateConnection-Methode das DbConnection-Objekt, und die ConnectionString-Eigenschaft wird auf die Verbindungszeichenfolge festgelegt.

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

Weitere Informationen