Dela via


Hämta en DbProviderFactory

Processen för att hämta en DbProviderFactory innebär att skicka information om en dataprovider till DbProviderFactories klassen. Baserat på den här informationen GetFactory skapar metoden en starkt typad leverantörsfabrik. Om du till exempel vill skapa en SqlClientFactorykan du skicka GetFactory en sträng med providernamnet som anges som "System.Data.SqlClient". Den andra överlagringen av GetFactory tar en DataRow. När du har skapat providerfabriken kan du sedan använda dess metoder för att skapa ytterligare objekt. Några av metoderna i en SqlClientFactory inkluderar CreateConnection, CreateCommandoch CreateDataAdapter.

Kommentar

Klasserna OracleClientFactory, OdbcFactoryoch OleDbFactory ger också liknande funktioner.

Registrera DbProviderFactories

Varje .NET Framework-dataprovider som stöder en fabriksbaserad klass registrerar konfigurationsinformation i avsnittet DbProviderFactories i filen machine.config på den lokala datorn. Följande konfigurationsfilfragment visar syntaxen och formatet 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>

Attributet invariant identifierar den underliggande dataprovidern. Den här namngivningssyntaxen i tre delar används också när du skapar en ny fabrik och för att identifiera providern i en programkonfigurationsfil så att providernamnet, tillsammans med dess associerade niska veze, kan hämtas vid körning.

Hämtar providerinformation

Du kan hämta information om alla dataproviders som är installerade på den lokala datorn med hjälp GetFactoryClasses av metoden . Den returnerar en DataTable namngiven DbProviderFactories som innehåller kolumnerna som beskrivs i följande tabell.

Kolumnordning Kolumnnamn Exempel på utdata beskrivning
0 Namn SqlClient-dataprovider Läsbart namn för dataprovidern
1 Beskrivning .Net Framework Data Provider för SqlServer Läsbar beskrivning av dataprovidern
2 InvariantName System.Data.SqlClient Namn som kan användas programmatiskt för att referera till dataprovidern
3 AssemblyQualifiedName System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Fullständigt kvalificerat namn på fabriksklassen, som innehåller tillräckligt med information för att instansiera objektet

Detta DataTable kan användas för att göra det möjligt för en användare att välja en DataRow vid körning. Den valda DataRow kan sedan skickas till GetFactory metoden för att skapa en starkt typad DbProviderFactory. En markerad DataRow kan skickas till GetFactory metoden för att skapa det önskade DbProviderFactory objektet.

Visa en lista över installerade providerfabriksklasser

Det här exemplet visar hur du använder GetFactoryClasses metoden för att returnera en DataTable innehållande information om de installerade leverantörerna. Koden itererar genom varje rad i och DataTablevisar information för varje installerad provider i konsolfönstret.

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

Använda programkonfigurationsfiler för att lagra fabriksinformation

Designmönstret som används för att arbeta med fabriker innebär lagring av provider och niska veze information i en programkonfigurationsfil, till exempel app.config för ett Windows-program och web.config för ett ASP.NET-program.

Följande konfigurationsfilfragment visar hur du sparar två namngivna niska veze: "NorthwindSQL" för en anslutning till Northwind-databasen i SQL Server och "NorthwindAccess" för en anslutning till Northwind-databasen i Access/Jet. Det invarianta namnet används för attributet 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>

Viktigt!

Microsoft rekommenderar att du använder det säkraste tillgängliga autentiseringsflödet. Om du ansluter till Azure SQL är hanterade identiteter för Azure-resurser den rekommenderade autentiseringsmetoden.

Hämta en anslutningssträng efter providernamn

För att kunna skapa en providerfabrik måste du ange en niska veze samt providernamnet. Det här exemplet visar hur du hämtar en niska veze från en programkonfigurationsfil genom att skicka providernamnet i det invarianta formatet "System.Data.ProviderName". Koden itererar via ConnectionStringSettingsCollection. Den returnerar vid ProviderName lyckat resultat, annars null (Nothing i Visual Basic). Om det finns flera poster för en provider returneras den första som hittas. Mer information och exempel på hur du hämtar niska veze från konfigurationsfiler finns i Anslutningssträngar och Konfigurationsfiler.

Kommentar

En referens till System.Configuration.dll krävs för att koden ska kunna köras.

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

Skapa DbProviderFactory och DbConnection

Det här exemplet visar hur du skapar ett DbProviderFactory objekt och DbConnection genom att skicka providernamnet i formatet "System.Data.ProviderName" och en niska veze. Ett DbConnection objekt returneras vid lyckat resultat. null (Nothing i Visual Basic) om eventuella fel.

Koden hämtar genom att DbProviderFactory anropa GetFactory. CreateConnection Sedan skapar DbConnection metoden objektet och egenskapen ConnectionString är inställd på niska veze.

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

Se även