如何在EnterpriseLibrary 6.0中设置UserID和密码

时间:2013-06-22 22:46:35

标签: enterprise-library enterprise-library-6

我编码如下:

#CODE

DatabaseProviderFactory factory = new DatabaseProviderFactory();  database = factory.Create(“DBinstanceName”);

ConfigFile条目

       

<oracleConnectionSettings>
    <add name="CNQ" />
</oracleConnectionSettings>

                   

<connectionStrings>
    <add name="CNQ" connectionString=" Min Pool Size=0;Connection Lifetime=120;Max Pool Size=50; Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST= XXXX.com)(PORT=1521))) (CONNECT_DATA = (SID = cnq) (SERVER = DEDICATED) ) );"
        providerName="Oracle.DataAccess.Client" />
</connectionStrings>

使用上面的代码和配置设置,可以完美地创建DatabaseObject。当我验证连接字符串时,它具有我在连接字符串中提到的值。到目前为止还不错。

现在,我必须添加UserId&amp;运行时连接字符串的密码。我找不到将用户凭据添加到现有连接字符串的方法。因此,在Database对象中,连接字符串是READ ONLY。

我找到的唯一方法是在配置文件[App.config]中设置,这不是我们想要的方式,因为对于每个用户,我们在Oracle数据库中都有一个单独的用户ID和密码。

事实上,我曾尝试通过设置命令对象的连接,并将命令对象传递给执行阅读器,甚至还将企业库6.0传递给了我们在命令对象中设置的连接。

请帮助我们如何在运行时设置用户ID和密码。

提前致谢

2 个答案:

答案 0 :(得分:2)

为了在运行时设置连接字符串值,您必须以编程方式创建数据库对象。例如:

Database database = new GenericDatabase(GetConnectionString(), 
    DbProviderFactories.GetFactory("Oracle.DataAccess.Client"));

或者,如果您使用的是OracleDatabase:

OracleDatabase database = new OracleDatabase(GetConnectionString());

您可以使用扩展方法来隐藏一些丑陋的内容:

DatabaseProviderFactory factory = new DatabaseProviderFactory();

Database db = factory.CreateWithConnectionString(GetConnectionString(), 
    DbProviderFactories.GetFactory("Oracle.DataAccess.Client"));

db = factory.CreateOracleDatabase(GetConnectionString());


public static class DatabaseProviderFactoryExtensions
{
    public static Database CreateWithConnectionString(this DatabaseProviderFactory factory,
        string connectionString,
        DbProviderFactory dbProviderFactory)
    {
        return new GenericDatabase(connectionString, dbProviderFactory);
    }

    public static Database CreateOracleDatabase(this DatabaseProviderFactory factory,
        string connectionString)
    {
        return new OracleDatabase(connectionString);
    }
}

如果您事先知道(仍在运行时但可能在应用程序启动时)您将知道哪些连接是另一种解决问题的方法,那就是使用DatabaseFactory.SetDatabases方法根据密钥返回正确的数据库。不幸的是,该方法只需要一个字符串,因此您无法很好地指定用户名和密码,但您可以执行以下操作:

DatabaseFactory.SetDatabases(() => GetDatabase("Default"),
    (dbName) => GetDatabase(dbName));

Database db = DatabaseFactory.CreateDatabase();               

public Database GetDatabase(string dbName)
{
    string connectionString = GetConnectionString(dbName);
    return new OracleDatabase(connectionString);
}

GetConnectionString方法可以根据名称创建正确的连接字符串。但是,考虑到你的描述,我猜这最后的方式可能不是最好的。

答案 1 :(得分:0)

感谢您的回复。

因为我使用的是Enterprise Library 6.0,所以只有第一个答案才有效。

Database database = new GenericDatabase(GetConnectionString(), 
    DbProviderFactories.GetFactory("Oracle.DataAccess.Client"));

[或]

Oralce.DataAccess.Client.OralceClientFactory ocf = new Oracle.DataAccess.Client.OracleClientFactory();

Database database = new GenericDatabase(GetConnectionString(), ocf);

由于