Как установить идентификатор пользователя и пароль в EnterpriseLibrary 6.0
Я закодировал как ниже:
#Код
DatabaseProviderFactory factory = new DatabaseProviderFactory(); база данных = 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 создан идеально. Когда я проверяю строку подключения, она имеет значения, которые я упоминал в строке подключения. Пока все хорошо.
Теперь мне нужно добавить идентификатор пользователя и пароль в строку подключения во время выполнения. Нет способов найти учетные данные пользователя для существующей строки подключения. Потому что в объекте базы данных строка подключения ТОЛЬКО ЧТЕНИЕ.
Единственный способ, который я найду, - это установить в файле конфигурации [App.config], что нам не нужно, потому что для каждого пользователя у нас есть отдельный ИД пользователя и пароль в базе данных Oracle.
Фактически, я попытался с помощью настроек соединений в объекте команды и передал объект команды читателю выполнения, даже тогда также корпоративной библиотеке 6.0, не принимая соединение, которое мы установили в объекте команды.
Пожалуйста, помогите нам, как установить ID пользователя и пароль во время выполнения.
заранее спасибо
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
Метод может создать правильную строку подключения на основе имени. Тем не менее, я предполагаю, что этот последний способ может быть не лучшим, учитывая ваше описание.
Спасибо за ваш ответ.
Поскольку я использую 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);
Спасибо