我创建了一个db对象
sqlDB = EnterpriseLibraryContainer.Current
.GetInstance<Database>("ProdConn");
但后来在代码中,我想更改数据库名称。 在以前的企业版中,我们使用
conn.ChangeDatabase("ABCD");
更改数据库,但我们如何在此处执行此操作?
请建议。
感谢, Mujeeb。
答案 0 :(得分:2)
我认为ChangeDatabase
不是企业库方法(我在版本4.1中也找不到它)。我认为这只是一个ADO method on IDbConnection
。
我可以通过3种方式来做你想做的事:
Database
对象就个人而言,我认为这是最干净的选择。将数据库添加为配置中的新条目,并将其视为单独的数据库。但是,如果您需要支持动态数据库,因为数据库名称在设计时未知或者从其他系统检索,那么这将无效。
您可以检索连接并只使用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代码混合在一起感觉有些不对劲。
您可以使用企业库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);