ASP.NET: Wie eine Verbindung von einem web.config Connectionstring erstellen?
-
20-08-2019 - |
Frage
Wie konstruieren Sie ein DbConnection basierend auf einem Provider-Namen
Beispiel Providername s
- System.Data.SqlClient
- System.Data.OleDb
- System.Data.Odbc
- FirebirdSql.Data.FirebirdClient
i-Verbindungszeichenfolgen in meinem IIS-Server web.config-Datei gespeichert haben:
<connectionStrings>
<add name="development"
connectionString="Provider = IBMDA400; Data Source = MY_SYSTEM_NAME; User Id = myUsername; Password = myPassword;"
providerName="System.Data.OleDb" />
<add name="live"
connectionString="usd=sa;pwd=password;server=deathstar;"
providerName="System.Data.Odbc" />
<add name="testing"
connectionString="usd=sa;pwd=password;server=deathstar;"
providerName="System.Data.SqlClient" />
<add name="offline"
connectionString="Server=localhost;User=SYSDBA;Password=masterkey;Charser=NONE;Database=c:\data\mydb.fdb"
providerName="FirebirdSql.Data.FirebirdClient"/>
Sie können sehen, dass sie alle verschiedene Anbieter nutzen. Wenn es Zeit wird für mich eine Verbindung zu schaffen, muß ich wissen, welche Art von DbConnection zu schaffen, z.
- SqlConnection
- OleDbConnection
- OdbcConnection
- FbConnection
Die connection Einträge enthält ein provider , aber diese sind nicht die Namen der DbConnection abgeleiteten Klassen, aber zu sein scheinen ein Namespace
Wie schalte ich ein DbConnection Konstrukt basiert auf einer Zeichenfolge provider
public DbConnection GetConnection(String connectionName)
{
//Get the connectionString infomation
ConnectionStringSettings cs =
ConfigurationManager.ConnectionStrings[connectionName];
if (cs == null)
throw new ConfigurationException("Invalid connection name \""+connectionName+"\");
//Create a connection based on the provider
DbConnection conn = new DbConnection();
}
Lösung
Wenn Sie diesen Weg gehen, ich glaube, Sie werden die DbProviderFactories Klasse verwenden möchten, einen DbProviderFactory zu erhalten, die Sie verwenden können, um die Verbindung aufzubauen. Ich habe den Code nicht ausprobiert, aber ich denke, es wird funktionieren. Es ist möglich, dass Sie nach oben schauen müssen, um den Namen des Anbieters die GetFactoryClasses Methode auf der DbProviderFactories-Klasse und die Invariantname verwenden.
public DbConnection GetConnection(String connectionName)
{
//Get the connection string info from web.config
ConnectionStringSettings cs=
ConfigurationManager.ConnectionStrings[connectionName];
//documented to return null if it couldn't be found
if (cs == null)
throw new ConfigurationErrorsException("Invalid connection name \""+connectionName+"\"");
//Get the factory for the given provider (e.g. "System.Data.SqlClient")
DbProviderFactory factory =
DbProviderFactories.GetFactory(cs.ProviderName);
//Undefined behaviour if GetFactory couldn't find a provider.
//Defensive test for null factory anyway
if (factory == null)
throw new Exception("Could not obtain factory for provider \""+cs.ProviderName+"\"");
//Have the factory give us the right connection object
DbConnection conn = factory.CreateConnection();
//Undefined behaviour if CreateConnection failed
//Defensive test for null connection anyway
if (conn == null)
throw new Exception("Could not obtain connection from factory");
//Knowing the connection string, open the connection
conn.ConnectionString = cs.ConnectionString;
conn.Open()
return conn;
}
Andere Tipps
Schauen Sie sich diesem Hanselman Blog auf das Hinzufügen von benutzerdefinierten Typen für unterschiedliche Verbindungszeichennamen bauen , es sieht aus wie kann es passen, was man in einer anderen Art und Weise erreichen will als den Provider-Typen verwendet wird.
Wenn die provider für die jeweilige Verbindungsnamen (dev, test, prod) ändert sich nie Warum kann man einen Schalter auf der connection param für Ihre Methode zu tun und die provider Instanz auf diese Weise eingestellt?