c# – 如何在Enterprise Library 5.0中更改数据库

我创建了一个db对象

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

但后来在代码中,我想更改数据库名称.
在以前的企业版中,我们使用

conn.ChangeDatabase("ABCD");

更改数据库,但我们如何在这里做到这一点?

请指教.

谢谢,
Mujeeb.

最佳答案 我不认为ChangeDatabase是企业库方法(我也无法在4.1版中找到它).我认为这只是一个
ADO method on IDbConnection.

我有三种方法可以做你想做的事:

>在Enterprise Library配置中创建新数据库条目并使用该值
>使用ADO.NET更改连接并执行数据访问
>使用不同的数据库值以编程方式创建新的Enterprise Library Database对象

1.在Config中创建新的数据库条目

就个人而言,我认为这是最干净的选择.将数据库添加为配置中的新条目,并将其视为单独的数据库.但是,如果您需要支持动态数据库,因为数据库名称在设计时未知或从其他系统检索,则无法运行.

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.创建新的企业库数据库对象

您可以使用Enterprise Library Database类,而不是使用ADO.NET.您不能修改ConnectionString(它是只读的),但您可以使用新的连接字符串创建新的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);
点赞