Język

Uzyskiwanie DbProviderFactory

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

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

Zobacz też