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

时间:2011-09-26 13:53:49

标签: c# .net asp.net enterprise-library enterprise

我创建了一个db对象

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

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

conn.ChangeDatabase("ABCD");

更改数据库,但我们如何在此处执行此操作?

请建议。

感谢, Mujeeb。

1 个答案:

答案 0 :(得分:2)

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

我可以通过3种方式来做你想做的事:

  1. 在Enterprise Library配置中创建新数据库条目并使用该值
  2. 使用ADO.NET更改连接并执行数据访问
  3. 使用不同的数据库值以编程方式创建新的Enterprise Library Database对象
  4. 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。创建新的企业库数据库对象

    您可以使用企业库Database类,而不是使用ADO.NET。您无法修改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);