Recupero di un oggetto DbProviderFactory
Il processo di recupero di un oggetto DbProviderFactory implica il passaggio delle informazioni su un provider di dati alla classe DbProviderFactories. Sulla base di queste informazioni, il metodo GetFactory crea una factory del provider fortemente tipizzata. Ad esempio, per creare un oggetto SqlClientFactory, è possibile passare a GetFactory
una stringa contenente il nome del provider specificato come "System.Data.SqlClient". L'altro overload di GetFactory
accetta un oggetto DataRow. Dopo aver creato la factory del provider, è quindi possibile usarne i metodi per creare altri oggetti. I metodi di un oggetto SqlClientFactory
includono CreateConnection, CreateCommande CreateDataAdapter.
Nota
Anche le classi OracleClientFactory, OdbcFactory e OleDbFactory forniscono funzionalità analoghe.
Registrazione in DbProviderFactories
Ogni provider di dati .NET Framework che supporta una classe basata su factory registra le informazioni di configurazione nella sezione DbProviderFactories del file machine.config del computer locale. Nel frammento di file di configurazione seguente sono illustrati la sintassi e il formato di 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>
L'attributo invariant identifica il provider di dati sottostante. La sintassi di denominazione in tre parti viene inoltre usata durante la creazione di una nuova factory e per l'identificazione del provider in un file di configurazione dell'applicazione in modo da consentire il recupero del nome del provider, unitamente alla stringa di connessione associata, in fase di esecuzione.
Recupero di informazioni sul provider
È possibile recuperare informazioni su tutti i provider di dati installati nel computer locale usando il metodo GetFactoryClasses. Tale metodo DataTable restituisce un oggetto denominato DbProviderFactories che contiene le colonne descritte nella tabella seguente.
Ordinale colonna | Nome colonna | Output di esempio | Descrizione |
---|---|---|---|
0 | Nome | Provider di dati SqlClient | Nome leggibile del provider di dati |
1 | Descrizione | Provider di dati .NET Framework per SQL Server | Descrizione leggibile del provider di dati |
2 | InvariantName | System.Data.SqlClient | Nome da usare a livello di codice per fare riferimento al provider di dati |
3 | AssemblyQualifiedName | System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | Nome completo della classe factory, che contiene informazioni sufficienti per creare un'istanza dell'oggetto |
È possibile usare un oggetto DataTable
per consentire a un utente di selezionare un oggetto DataRow in fase di esecuzione. È quindi possibile passare l'oggetto DataRow
selezionato al metodo GetFactory per creare un oggetto DbProviderFactory fortemente tipizzato. È possibile passare un oggetto DataRow selezionato al metodo GetFactory
per creare l'oggetto DbProviderFactory
desiderato.
Visualizzazione dell'elenco delle classi del factory di provider installate
In questo esempio viene illustrato l'uso del metodo GetFactoryClasses per restituire un oggetto DataTable che contiene informazioni sui provider installati. Il codice consente di scorrere le singole righe dell'oggetto DataTable
, visualizzando le informazioni su ogni provider installato nella finestra della console.
// 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
Utilizzo dei file di configurazione dell'archiviazione per archiviare le informazioni sulla factory
Lo schema progettuale usato per la gestione delle factory prevede l'archiviazione delle informazioni relative al provider e alla stringa di connessione in un file di configurazione dell'applicazione, ad esempio app.config per un'applicazione Windows e web.config per un'applicazione ASP.NET.
Nel frammento del file di configurazione seguente viene illustrato come salvare due stringhe di connessione denominate rispettivamente "NorthwindSQL" per una connessione al database Northwind in SQL Server e "NorthwindAccess" per una connessione al database Northwind in Access/Jet. Per l'attributo providerName viene usato il nome invariant.
<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>
Importante
Microsoft consiglia di usare il flusso di autenticazione più sicuro disponibile. Se ci si connette ad Azure SQL, le Identità gestite per le risorse Azure sono il metodo di autenticazione consigliato.
Recupero di una stringa di connessione in base al nome del provider
Per creare una factory del provider, è necessario fornire una stringa di connessione oltre al nome del provider. In questo esempio viene illustrato come recuperare una stringa di connessione da un file di configurazione dell'applicazione passando il nome del provider nel formato invariant "System.Data.ProviderName". Il codice consente di scorrere gli elementi di ConnectionStringSettingsCollection. In caso di esito positivo, restituisce ProviderName; in caso contrario, restituisce null
(Nothing
in Visual Basic). Se per un provider sono disponibili più stringhe, viene restituita la prima stringa trovata. Per altre informazioni ed esempi di recupero delle stringhe di connessione dai file di configurazione, vedere Stringhe di connessione e file di configurazione.
Nota
Per consentire l'esecuzione del codice, è necessario un riferimento a System.Configuration.dll
.
// 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
Creazione di oggetti DbProviderFactory e DbConnection
In questo esempio viene illustrato come creare un oggetto DbProviderFactory e DbConnection passando ad essi il nome del provider in formato "System.Data.ProviderName" e una stringa di connessione. In caso di esito positivo, viene restituito un oggetto DbConnection
; in caso di errore, viene restituito null
(Nothing
in Visual Basic).
Il codice ottiene l'oggetto DbProviderFactory
mediante una chiamata a GetFactory. Il metodo CreateConnection crea quindi l'oggetto DbConnection e la proprietà ConnectionString viene impostata sulla stringa di connessione.
// 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