Я не думаю, что ChangeDatabase
- это метод Enterprise Library (я также не смог найти его в версии 4.1). Я думаю, что это просто метод ADO на IDbConnection
.
Есть 3 способа сделать то, что вы хотите:
- Создайте новую запись базы данных в конфигурации Enterprise Library и используйте это значение
- Использование ADO.NET для изменения соединения и доступа к данным
- Программно создать новый объект Enterprise Library
Database
, используя другое значение базы данных
1. Создать новую запись в базе данных в конфигурации
Лично я считаю, что это самый чистый вариант. Добавьте базу данных в качестве новой записи в конфигурации и рассматривайте ее как отдельную базу данных. Однако, если вам необходимо поддерживать динамические базы данных, поскольку имена баз данных неизвестны во время разработки или получены из другой системы, это не сработает.
2. Используйте ADO.NET
Вы можете восстановить соединение и просто использовать ADO.NET (я думаю, это может быть то, что вы уже делали?):
// Get Original EL DB
Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("MYDB");
object result = db.ExecuteScalar(CommandType.Text,
"select top 1 name from sysobjects");
Console.WriteLine(result);
// Change DB with ADO.NET
using (IDbConnection conn = db.CreateConnection())
{
conn.Open();
conn.ChangeDatabase("AnotherDB");
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select top 1 RoleName from Roles";
cmd.CommandType = CommandType.Text;
result = cmd.ExecuteScalar();
}
}
Console.WriteLine(result);
Смешивание кода EL с кодом ADO.NET кажется немного неправильным.
3. Создать новый объект базы данных библиотеки предприятия
Вместо использования ADO.NET вы можете использовать класс Enterprise Library Database
. Вы не можете изменить ConnectionString
(это readonly
), но вы можете создать новый Database
объект с новой строкой соединения.
// Get Original EL DB
Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("MYDB");
object result = db.ExecuteScalar(System.Data.CommandType.Text,
"select top 1 name from sysobjects");
Console.WriteLine(result);
// Change Database
DbConnectionStringBuilder builder = new DbConnectionStringBuilder()
{
ConnectionString = db.ConnectionString
};
builder["database"] = "AnotherDB";
// Create new EL DB using new connection string
db = new GenericDatabase(builder.ConnectionString, db.DbProviderFactory);
result = db.ExecuteScalar(CommandType.Text,
"select top 1 RoleName from Roles");
Console.WriteLine(result);
Я думаю, что это выглядит лучше, чем вариант 2. Мы можем сделать его немного чище, добавив логику изменения базы данных к вспомогательному методу или, как показано ниже, к методу расширения:
public static class DatabaseExtensions
{
public static Database ChangeDatabase(this Database db, string databaseName)
{
// Change Database
DbConnectionStringBuilder builder = new DbConnectionStringBuilder()
{
ConnectionString = db.ConnectionString
};
builder["database"] = databaseName;
// Create new EL DB using new connection string
return new GenericDatabase(builder.ConnectionString,
db.DbProviderFactory);
}
}
...
// Get Original EL DB
Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("MYDB");
object result = db.ExecuteScalar(System.Data.CommandType.Text,
"select top 1 name from sysobjects");
Console.WriteLine(result);
db = db.ChangeDatabase("AnotherDB");
result = db.ExecuteScalar(CommandType.Text,
"select top 1 RoleName from Roles");
Console.WriteLine(result);