Udostępnij za pośrednictwem


Uzyskiwanie DbProviderFactory

Proces uzyskiwania obiektu DbProviderFactory obejmuje przekazywanie informacji o dostawcy danych do DbProviderFactories klasy. Na podstawie tych informacji GetFactory metoda tworzy silnie typizowana fabrykę dostawcy. Aby na przykład utworzyć element SqlClientFactory, można przekazać GetFactory ciąg z nazwą dostawcy określoną jako "System.Data.SqlClient". Inne przeciążenie przyjmuje GetFactory element DataRow. Po utworzeniu fabryki dostawcy 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

Każdy dostawca danych programu .NET Framework obsługujący klasę opartą na fabryce rejestruje informacje o konfiguracji w sekcji DbProviderFactories pliku machine.config na komputerze lokalnym. Poniższy fragment pliku konfiguracji przedstawia składnię i format pliku .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>

Niezmienny atrybut identyfikuje bazowego dostawcę danych. Ta trzyczęściowa składnia nazewnictwa jest również używana podczas tworzenia nowej fabryki i identyfikowania dostawcy w pliku konfiguracji aplikacji, aby można było pobrać nazwę dostawcy wraz ze skojarzonymi parametry połączenia w czasie wykonywania.

Pobieranie informacji o dostawcy

Informacje o wszystkich dostawcach danych zainstalowanych na komputerze lokalnym można pobrać przy użyciu GetFactoryClasses metody . Zwraca on nazwę DbProviderFactories zawierającą DataTable kolumny opisane w poniższej tabeli.

Porządkowe kolumny Nazwa kolumny Przykładowe dane wyjściowe opis
0 Nazwa/nazwisko Dostawca danych SqlClient Czytelna nazwa dostawcy danych
1 Opis Dostawca danych programu .Net Framework dla programu SqlServer Czytelny opis dostawcy danych
2 InvariantName System.Data.SqlClient Nazwa, która może służyć programowo do odwoływania się do dostawcy danych
3 AssemblyQualifiedName System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 W pełni kwalifikowana nazwa klasy fabryki, która zawiera wystarczające informacje, aby utworzyć wystąpienie obiektu

Może to DataTable służyć do umożliwienia użytkownikowi wybrania DataRow elementu w czasie wykonywania. Następnie wybraną DataRow metodę GetFactory można przekazać do metody w celu utworzenia silnie typizowanego DbProviderFactoryelementu . Wybraną DataRow metodę GetFactory można przekazać do metody w celu utworzenia żądanego DbProviderFactory obiektu.

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 poszczególne wiersze w DataTableobiekcie , wyświetlając informacje dla każdego zainstalowanego dostawcy w oknie konsoli.

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

Używanie plików konfiguracji aplikacji do przechowywania informacji o fabryce

Wzorzec projektowy używany do pracy z fabrykami wiąże się z przechowywaniem dostawcy i parametry połączenia informacji w pliku konfiguracji aplikacji, takim jak app.config dla aplikacji systemu Windows i web.config dla aplikacji ASP.NET.

Poniższy fragment pliku konfiguracji przedstawia sposób zapisywania dwóch nazwanych parametry połączenia: "NorthwindSQL" dla połączenia z bazą danych Northwind w programie SQL Server i "NorthwindAccess" dla połączenia z bazą danych Northwind w programie Access/Jet. Niezmienna nazwa jest używana dla atrybutu providerName.

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

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ć fabrykę dostawcy, należy podać parametry połączenia oraz nazwę dostawcy. W tym przykładzie pokazano, jak pobrać parametry połączenia z pliku konfiguracji aplikacji, przekazując nazwę dostawcy w niezmiennym formacie "System.Data.ProviderName". Kod iteruje za pośrednictwem .ConnectionStringSettingsCollection Zwraca wartość przy powodzeniu ProviderName ; 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 elementu 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ć DbProviderFactory obiekt iDbConnection, przekazując mu nazwę dostawcy w formacie "System.Data.ProviderName" i parametry 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. CreateConnection Następnie metoda tworzy DbConnection obiekt, a ConnectionString właściwość jest ustawiona na parametry 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
        {
            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

Zobacz też