1

我编码如下:

#代码

DatabaseProviderFactory factory = new DatabaseProviderFactory(); 数据库 = factory.Create("DBinstanceName");

配置文件条目

<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 和 Password 添加到连接字符串中。我找不到将用户凭据添加到现有连接字符串的方法。因为,在数据库对象中,连接字符串是只读的。

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

事实上,我已经尝试通过在命令对象中设置连接,并将命令对象传递给执行阅读器,即使是企业库 6.0,也没有采用我们在命令对象中设置的连接。

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

提前致谢

4

2 回答 2

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方法可以根据名称创建正确的连接字符串。但是,根据您的描述,我猜这最后一种方式可能不是最好的。

于 2013-06-23T01:50:28.267 回答
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);

谢谢

于 2013-06-24T18:01:19.227 回答