簡體   English   中英

如何在Enterprise Library 5.0中更改數據庫

[英]How to change Database in Enterprise Library 5.0

我創建了一個數據庫對象

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

但是稍后在代碼中,我想更改數據庫名稱。 在以前的企業版本中,我們使用

conn.ChangeDatabase("ABCD");

更改數據庫,但是我們如何在這里做呢?

請指教。

謝謝,Mujeeb。

我認為ChangeDatabase不是企業庫方法(在4.1版中也找不到)。 我認為這只是IDbConnectionADO方法

我可以想到3種方法來做自己想要的事情:

  1. 在企業庫配置中創建一個新的數據庫條目,並使用該值
  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,還可以使用企業庫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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM