4

Oracle データベースで宣言された型があります。

CREATE OR REPLACE TYPE t_project_code_changes AS TABLE OF obj_project_code_change; 

私はC#でこのタイプにマップします

[OracleCustomTypeMapping("DEV_SCHEMA.OBJ_PROJECT_CODE_CHANGE")]
class ProjectCodeChangeFactory : TypeFactoryTemplate<ProjectCodeChangeDTO>
{
    //code
}

上記のコードはエラーなしで動作しますが、スキーマ名 'DEV_SCHEMA' を属性から削除すると失敗します:

[OracleCustomTypeMapping("OBJ_PROJECT_CODE_CHANGE")]

次のエラーが生成されます。

未処理の例外: System.InvalidOperationException: 'ProjectCodeChangeDTO' のカスタム型マッピングが指定されていないか、有効です。
Oracle.DataAccess.Types.OracleUdt.GetUdtName (文字列 customTypeName、文字列 dataSource) で

ある時点で、'DEV_SCHEMA' を過ぎたコードを出荷したいと考えていますが、これはコードの失敗につながります。

スキーマ名は接続文字列から取得されますUser Id

"Data Source=DBNAME;User id=DEV_SCHEMA;Password=pwd;Pooling=False;" 

これを支援するためにC#側のOracleでできることはありますか。つまり、どういうわけか:

  1. スキーマ名を属性パラメーターとして渡します
  2. スキーマを使用する必要がない方法で、Oracle で型を定義します。

追加情報として、この問題は、ODP.NET クライアント バージョン 11.1.0.7 を使用しているときに発生します。11.2 バージョンの DLL は、属性にスキーマ名がなくても完全に機能します。

どんな助けでも大歓迎です。

4

2 に答える 2

2

私は過去に以下を使用してこれを処理しました。

internal static class OracleConfig
{
#if SHIPPING
    internal const string SCHEMA = @"REL.";
#else
    internal const string SCHEMA = @"DEV.";
#endif
}

次に、次のように使用できます。

[OracleCustomTypeMapping(OracleConfig.SCHEMA + "OBJ_PROJECT_CODE_CHANGE")]
于 2011-01-25T21:05:13.277 に答える
2

属性のアプローチに固執する必要がない場合はOracleCustomTypeMapping、代わりに、構成ファイルを介してカスタム型マッピングを設定するのが最善の解決策だと思います。

于 2011-01-25T16:08:51.947 に答える