我编码如下:
DatabaseProviderFactory factory = new DatabaseProviderFactory(); database = 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&amp;运行时连接字符串的密码。我找不到将用户凭据添加到现有连接字符串的方法。因此,在Database对象中,连接字符串是READ ONLY。
我找到的唯一方法是在配置文件[App.config]中设置,这不是我们想要的方式,因为对于每个用户,我们在Oracle数据库中都有一个单独的用户ID和密码。
事实上,我曾尝试通过设置命令对象的连接,并将命令对象传递给执行阅读器,甚至还将企业库6.0传递给了我们在命令对象中设置的连接。
请帮助我们如何在运行时设置用户ID和密码。
提前致谢
答案 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);
由于