Как изменить базу данных в Enterprise Library 5.0 - PullRequest
4 голосов
/ 26 сентября 2011

Я создал объект db как

sqlDB = EnterpriseLibraryContainer.Current
    .GetInstance<Database>("ProdConn");

Но позже в коде я хочу изменить имя базы данных.В предыдущей корпоративной версии мы использовали

conn.ChangeDatabase("ABCD");

для изменения базы данных, но как мы можем это сделать здесь?

Пожалуйста, совет.

спасибо, Mujeeb.

1 Ответ

2 голосов
/ 26 сентября 2011

Я не думаю, что ChangeDatabase - это метод Enterprise Library (я также не смог найти его в версии 4.1). Я думаю, что это просто метод ADO на IDbConnection.

Есть 3 способа сделать то, что вы хотите:

  1. Создайте новую запись базы данных в конфигурации Enterprise Library и используйте это значение
  2. Использование ADO.NET для изменения соединения и доступа к данным
  3. Программно создать новый объект 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...