如何在企业库5.0中更改数据库

本文关键字:数据库 企业库 | 更新日期: 2023-09-27 18:09:56

我创建了一个db对象

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

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

conn.ChangeDatabase("ABCD");

来改变数据库,但是我们在这里怎么做呢?

请建议。

谢谢,Mujeeb .

如何在企业库5.0中更改数据库

我不认为ChangeDatabase是一个企业库方法(我在4.1版本中也找不到它)。我想这只是IDbConnection上的ADO方法。

我能想到三种方法来做你想做的事:

  1. 在企业库配置中创建一个新的数据库条目,并使用该值
  2. 使用ADO。. NET更改连接并执行数据访问
  3. 以编程方式使用不同的数据库值创建一个新的企业库Database对象

1。在Config

中创建一个新的数据库条目

我个人认为这是最干净的选择。将数据库作为一个新条目添加到配置中,并将其视为一个单独的数据库。但是,如果您需要支持动态数据库,因为数据库名称在设计时不知道或从不同的系统检索,那么这将无法工作。

2。使用ADO。净

您可以检索连接并仅使用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。你可以使用企业库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好。我们可以通过将更改数据库逻辑添加到helper方法或扩展方法(如下所示)来使其更简洁:

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);