Abrufen von C # Objekt korrekt DbConnection durch Verbindungszeichenfolge
-
06-07-2019 - |
Frage
Ich habe eine Verbindungszeichenfolge an eine Funktion übergeben wird, und ich brauche ein DbConnection Basis-Objekt (das heißt SQLConnection-, OracleConnection, OleDbConnection usw.) zu erstellen, basierend auf dieser Zeichenfolge.
Gibt es eine eingebaute Funktionalität, dies zu tun, oder alle 3rd-Party-Bibliotheken zu unterstützen. Wir sind nicht notwendigerweise den Aufbau dieser Verbindungszeichenfolge, so dass wir nicht auf ein Format setzen die Zeichenfolge geschrieben ist seine Art zu bestimmen, und ich würde bevorzugen nicht alle Kombinationen und Permutationen der möglichen Verbindung zu haben, Code auf Strings
Lösung
DbConnection GetConnection(string connStr)
{ string providerName = null;
var csb = new DbConnectionStringBuilder{ConnectionString=connStr};
if (csb.ContainsKey("provider"))
{ providerName = csb["provider"].ToString();
}
else
{ var css = ConfigurationManager
.ConnectionStrings
.Cast<ConnectionStringSettings>()
.FirstOrDefault(x=>x.ConnectionString==connStr);
if (css != null) providerName = css.ProviderName;
}
if (providerName != null)
{ var providerExists = DbProviderFactories
.GetFactoryClasses()
.Rows.Cast<DataRow>()
.Any(r=>r[2].Equals(providerName));
if (providerExists)
{ var factory = DbProviderFactories.GetFactory(providerName);
var dbConnection = factory.CreateConnection();
dbConnection.ConnectionString = connStr;
return dbConnection;
}
}
return null;
}
Andere Tipps
wenn Sie mit Framework 2.0 oder höher, und Sie können sie in einem zweiten String mit der Fahrer-Klasse übergeben, können Sie die DbProviderFactory-Klasse verwenden Sie den Treiber zu laden.
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass);
DbConnection dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = myConnectionString;
Hier ist ein MSDN Link auf die Factory-Klasse: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx
Sie sollten Lage sein, den Provider Abschnitt zu analysieren und sie in DbProviderFactories.GetFactory passieren, die eine OdbcFactory, OleDbFactory oder SqlClientFactory zurück und lassen Sie dann ausführen Create etc.
Ich bin mir nicht sicher, wie dies mit Oracle funktionieren würde, wenn sie eine OracleDbFactory liefern.
Die Verbindungszeichenfolgen (zumindest in .NET 2.0) haben auch eine provider Eigenschaft, die mit ihnen geht. So eine SQL-Verbindungszeichenfolge einen Provider-Namen haben wie:
providerName="System.Data.SqlClient"
So Ihre Methode müßte sowohl die Verbindungszeichenfolge und den Namen des Anbieters akzeptieren und dann könnten Sie die DbProviderFactory verwenden wie damieng erwähnt.