Как установить идентификатор пользователя и пароль в 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);

Спасибо

Другие вопросы по тегам