У меня есть фрагмент кода (.NET Framework 4.5.2, Enterprise Library 5.0.505.0), где мне нужно подключиться к базе данных SQL Server. Однако имя БД может меняться в зависимости от требований пользователя. Итак, у меня есть следующий фрагмент кода для динамической записи строки подключения в файл app.config.
public void CreateNewConnectionStringInConfig(string initialCatalog)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = ConfigurationManager.AppSettings["Data Source"];
builder.PersistSecurityInfo = true;
builder.InitialCatalog = initialCatalog; //This is the DB name
builder.UserID = ConfigurationManager.AppSettings["User ID"];
builder.Password = ConfigurationManager.AppSettings["Password"];
// Get the application configuration file.
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// Create a connection string element.
ConnectionStringSettings csSettings = new ConnectionStringSettings("UserSelectedConnectionString", builder.ConnectionString, "System.Data.SqlClient");
// Get the connection strings section.
ConnectionStringsSection csSection = config.ConnectionStrings;
// Add the new element.
csSection.ConnectionStrings.Add(csSettings);
// Save the configuration file.
config.Save(ConfigurationSaveMode.Modified);
// Refresh the section so the new configuration can be re-read
ConfigurationManager.RefreshSection("connectionStrings");
}
Я проверил, и строка подключения создается нормально в файле vshost.exe.Config во время отладки. Однако, когда я пытаюсь создать объект базы данных, я получаю сообщение об ошибке. Код, используемый для создания объекта БД, показан ниже.
public class MyDac
{
private readonly Database _db;
public MyDac()
{
DatabaseProviderFactory factory = new DatabaseProviderFactory();
_db = factory.Create("UserSelectedConnectionString");
}
}
Я получаю следующую ошибку при попытке создать объект _db.
Activation error occured while trying to get instance of type Database, key "UserSelectedConnectionString"
Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type Database, key "UserSelectedConnectionString" ---> Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "UserSelectedConnectionString".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The type Database does not have an accessible constructor.
Вещи, которые я пробовал:
1) Обновление версии Enterprise Library до 6.0.0.0 решает проблему, но мне это не подходит. Я должен сохранить его до версии 5.0.505.0.
2) Когда я заранее жестко кодирую строку подключения в файле App.config (вместо того, чтобы писать ее во время выполнения), приложение работает нормально. Однако в реальной жизни я не могу этого сделать, потому что имя базы данных будет постоянно меняться.
Любая помощь будет высоко ценится. Спасибо!