1

以下のようにコーディングしました。

#コード

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 は完全に作成されます。接続文字列を確認すると、接続文字列で言及した値が含まれています。これまでのところ良い。

ここで、実行時に UserId と Password を接続文字列に追加する必要があります。ユーザー資格情報を既存の接続文字列に追加する方法はありません。データベースオブジェクトでは、接続文字列が読み取り専用であるためです。

私が見つけた唯一の方法は、構成ファイル[App.config]に設定することですが、これは私たちが望む方法ではありません.Oracleデータベースにはユーザーごとに個別のユーザーIDとパスワードがあるためです.

実際、コマンド オブジェクトで接続を設定してみましたが、コマンド オブジェクトで設定した接続を使用せずに、コマンド オブジェクトを実行リーダーに渡しました。

ランタイムでユーザー ID とパスワードを設定する方法を教えてください。

前もって感謝します

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 に答える