プライマリ・コンテンツに移動
Oracle® Data Provider for .NET開発者ガイド
ODAC 12c リリース4 (12.1.0.2) for Microsoft Windows
E72575-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

Oracleユーザー定義タイプ(UDT)および.NETカスタム・タイプ

ODP.NETには、データベース内のOracle UDTを、.NETアプリケーションのカスタム・タイプとして表す機能があります。UDTはアプリケーション間で共有できる単一オブジェクトとして複雑な実体を表すのに便利です。Oracle製品(Oracle SpatialおよびOracle XML DBなど)では、製品独自の複雑なタイプを頻繁に使用しています。

Oracle UDTを.NETカスタム・タイプとして表すには、アプリケーションに.NET属性をカスタム・クラスおよび構造体、そしてそれらのパブリック・フィールドおよびプロパティに適用します。


注意:

ODP.NET管理対象ドライバは、UDTおよび.NETカスタム・タイプをサポートしていません。

UDTおよびカスタム・タイプ間で変換するには、ODP.NETはカスタム・インタフェースを使用します。

このセクションの内容は次のとおりです。

Oracleユーザー定義タイプ(UDT)

Oracle Data Provider for .NETは、Oracleオブジェクト型またはユーザー定義タイプ(UDT)をサポートしており、Oracle Databaseに定義されています。

次の2種類のUDTがあります。

  • オブジェクト・タイプ(Oracleオブジェクト)

  • コレクション・タイプ(VARRAYタイプまたはネスト表タイプ)

また、ODP.NETはオブジェクト・タイプに対して参照(REF)をサポートしています。


関連項目:

「OracleRefクラス」

UDTという用語は、Oracleオブジェクト型および抽出データ型(ADT)と同じ意味で使用されます。


関連項目:

オブジェクト・タイプの詳細な説明は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照

Oracle UDTの名前は大/小文字を区別し、schema_name.type_name形式にする必要があります。

ORACLE_BASE\\ORACLE_HOME\ODP.NET\Samples\UDTディレクトリにUDTのサンプルが用意されています。

カスタム・タイプ

Oracle Data Provider for .NETは、UDTをサポートしており、.NETタイプ、つまりカスタム・タイプとしてデータベースに定義されたOracle UDTを表します。アプリケーションがフェッチおよび操作するOracle UDTごとに、1つのカスタム・タイプ・ファクトリおよび1つのカスタム・タイプが必要です。カスタム・ファクトリ・クラスは、カスタム・タイプのインスタンス化のみ実行します。ODP.NETはカスタム・ファクトリ・クラスに実装されたインタフェースを使用して、実行時にカスタム・タイプをインスタンス化します。カスタム・タイプは、Oracle UDT属性または要素間で.NETメンバーへのマッピングを定義します。ODP.NETはカスタム・タイプ・インスタンスに実装されたインタフェースを使用して、実行時にOracle UDTとカスタム・タイプ間で値を変換します。

カスタム・タイプは、.NETクラスまたは構造体のいずれかです。これらはOracleオブジェクトまたはOracleコレクションのいずれかを表します。カスタム・タイプは、アプリケーション開発者が手動でカスタム・タイプを実装するか、またはODP.NETコード生成ツールを使用して生成できます。

ファクトリ・クラスおよびカスタム・タイプが定義されて実装要件を満たすと、アプリケーションは、ODP.NETを設定してOracle UDTとカスタム・タイプ間のマッピングを自動的に検索します。この検索プロセスは、カスタム・ファクトリ・クラスに適用された属性に基づいています。また、構成ファイルから明示的なマッピングが提供されます。

Oracleコレクションを.NETタイプの配列として表すことができます。たとえば、Oracleコレクション型のNUMBERint[]にマッピングできます。さらにOracleコレクション型のOracle UDTをカスタム・タイプの配列にマッピングできます。

カスタム・タイプは、カスタム・タイプとしてOracle UDTを表すためにODP.NETの一定の要件に従う必要があります。要件は次のとおりです。

必須カスタム・タイプ実装

この項では、カスタム.NETクラスまたは構造に必要な実装をリストします。

  • Oracle.DataAcess.Types.IOracleCustomTypeインタフェースの実装

    このインタフェースは、カスタム・タイプおよびOracle UDT間の変換に使用されます。

    OracleUdtクラスの静的メソッドを使用して、このインタフェース・メソッドを実装します。

  • カスタム・タイプ・ファクトリ

    カスタム・タイプ・ファクトリを使用して、カスタム・タイプのインスタンスを作成します。カスタム・タイプ・ファクトリは、次に示すようなIOracleCustomTypeFactoryインタフェース、IOracleArrayTypeFactoryインタフェースまたは両方のインタフェースのいずれかになります。

    • Oracleオブジェクトを表すカスタム・タイプを作成するには、カスタム・タイプまたは個々のカスタム・タイプ・ファクトリ・クラスがOracle.DataAccess.Types.IOracleCustomTypeFactoryインタフェースを実装する必要があります。

    • Oracleコレクションを表すカスタム・タイプを作成するには、カスタム・タイプまたは個々のカスタム・タイプ・ファクトリ・クラスがOracle.DataAccess.Types.IOracleCustomTypeFactoryインタフェースおよびOracle.DataAccess.Types.IOracleArrayTypeFactoryインタフェースを実装する必要があります。

    • Oracleコレクションを表す配列タイプを作成するには、カスタム・タイプ・ファクトリ・クラスがOracle.DataAccess.Types.IOracleArrayTypeFactoryインタフェースを実装する必要があります。

  • カスタム・タイプ・メンバーのマッピング属性

    カスタム・タイプ・メンバーのマッピング属性は、カスタム・タイプ・メンバーと、OracleオブジェクトまたはOracleコレクション要素のいずれかの間のマッピングを指定します。

    カスタム・タイプ・メンバーのマッピング属性には次の2種類があります。

    • OracleObjectMappingAttribute

      この属性は、カスタム・タイプ・メンバーと、Oracleオブジェクトを表すカスタム・タイプのOracleオブジェクト属性の間のマッピングを指定します。この属性を、Oracleオブジェクト属性を表す各カスタム・タイプ・メンバー(フィールドやプロパティ)に適用する必要があります。


      注意:

      すべてのOracleオブジェクト属性をカスタム・タイプ・メンバーにマップする必要はありません。特定のオブジェクト属性にOracleObjectMappingAttributeがない場合、Oracleオブジェクトとカスタム・タイプ間の変換の際にはODP.NETはそのオブジェクト属性を無視します。

    • OracleArrayMappingAttribute

      この属性は、Oracleコレクションを表すカスタム・タイプのOracleコレクションの要素を格納するカスタム・タイプ・メンバーを指定します。属性は、1つのカスタム・タイプ・メンバーで指定される必要があります。

  • Oracle.DataAcess.Types.INullableインタフェースの実装

    このインタフェースは、カスタム・タイプのインスタンスがNULL UDTを表しているかどうかを判断するために使用されます。このインタフェースのIsNullプロパティにより、アプリケーションおよびODP.NETはUDTがNULLかどうかを判断できます。

  • 静的NULLフィールド

    パブリック静的Nullプロパティは、NULL UDTを戻すために使用されます。このプロパティは、TRUEを戻すIsNullプロパティと関連するカスタム・タイプを戻します。

オプションのカスタム・タイプの実装

次に示すのはオプションです。

  • IXMLSerializable

    IXMLSerializableインタフェースを.NET 2.0 frameworkで使用すると、カスタム・タイプとそのXML表現の間の変換が可能になります。このインタフェースが使用されるのは、カスタム・タイプのシリアライゼーションおよびデシリアライゼーションがDataSetで必要となる場合のみです。

  • Static ParseおよびPublic ToStringメソッド

    これらのメソッドにより、カスタム・タイプとその文字列表現の間の変換が可能になります。

    このメソッドはDataGridコントロールが変更を受け入れてインスタンス値を表示する際に呼び出されます。

  • タイプの継承

    タイプの継承は、スーパー・タイプからデータベース内のOracle UDTを導出するプロセスを参照します。

    カスタム・タイプがスーパー・タイプから導出されるOracle UDTを表す場合、カスタム・クラスは同じタイプの階層に従う必要があるため、カスタム・クラスは、データベース内で定義されたスーパー・タイプを表す別のカスタム・クラスから導出される必要があります。

  • OracleCustomTypeMappingAttribute

    OracleCustomTypeMappingAttributeオブジェクトは、カスタム・タイプ(または配列タイプ)とOracle UDT間のマッピングを指定します。

    次に示すアプリケーションが使用する各Oracle UDTに対して、カスタム・タイプ・ファクトリは一意である必要があります。

    • Oracleオブジェクト型には次のものがあります。

      カスタム・タイプ・ファクトリは、指定されたOracleオブジェクト型を表すカスタム・タイプのみを戻す必要があります。

    • Oracleコレクション型には次のものがあります。

      カスタム・タイプ・ファクトリは、その他のOracleコレクション型が使用できるカスタム・タイプを戻す場合があります。これは、たとえばint[]NUMBERのコレクションを表すために使用される場合など、配列タイプがOracleコレクションを表すために使用される場合に共通です。

    OracleCustomTypeMappingAttributeが指定されていない場合、カスタム・タイプ・マッピングは、XML構成ファイル、つまりmachine.configおよびWindowsアプリケーションのapp.configか、またはWebアプリケーションのweb.configから指定する必要があります。

カスタム・タイプ・マッピングの指定

カスタム・タイプの作成後、アプリケーションはカスタム・タイプ・マッピングを指定し、カスタム・タイプをデータベース内のOracle UDTにマップする必要があります。これは、カスタム・タイプ・ファクトリまたは構成ファイルにあるXMLを使用して実行できます。

この両方が実装されている場合は、XMLを使用したカスタム・タイプ・マッピングの指定が優先されます。実行時に、構成ファイルで指定されたカスタム・タイプ・マッピングがODP.NETによって検出されると、OracleCustomTypeMappingAttributeオブジェクトを使用して指定されたカスタム・タイプ・マッピングは無視されます。.NETアプリケーションがOracle UDTがマップされている.NETクラスを含む.NETアセンブリを動的にロードする場合、.NETクラスとOracle UDTとのマッピングは.NET構成ファイルを使用して構成される必要があります。

カスタム・タイプ・マッピングの場合、マッピングがOracleCustomTypeMappingAttributeオブジェクトまたはXML構成ファイルによるものかどうかにかかわらず、シノニムの使用を指定することはできません。


関連項目:

UDTマッピングの詳細は、Oracle Developer Tools for Visual StudioヘルプのVisual StudioのServer Explorerにあるユーザー定義タイプ・ノードに関する項を参照してください。

この項の内容は次のとおりです。

カスタム・タイプ・ファクトリを使用したカスタム・タイプ・マッピングの指定

アプリケーションは、カスタム・タイプ・ファクトリを使用してカスタム・タイプ・マッピングを指定できます。アプリケーションはschema_name.type_nameの形式でOracleCustomTypeMappingAttributeオブジェクトにOracle UDTの名前を指定し、その名前を対応するカスタム・タイプ・ファクトリに適用します。カスタム・タイプ・ファクトリはクラスまたは構造体であり、IOracleCustomTypeFactoryおよびIOracleArrayTypeFactoryインタフェースのいずれかまたは両方を実装しています。

アプリケーションが使用する各Oracle UDTは、必ず一意のカスタム・タイプ・ファクトリであることに注意してください。さらに、Oracleオブジェクト型では、カスタム・タイプ・ファクトリは指定されたOracleオブジェクト型を一意に表すカスタム・タイプを戻す必要があります。Oracleコレクション型では、カスタム・タイプ・ファクトリは、他のOracleコレクション型が使用できるカスタム・タイプを戻します。これは、配列タイプのカスタム・タイプがOracleコレクションを表す場合、つまりint[]を使用してNUMBERのコレクションを表す場合に共通です。

実行時にリフレクション・プログラミングを使用すると、OracleCustomTypeMappingAttributeオブジェクトを通して、ODP.NETはアプリケーションが指定するすべてのカスタム・タイプ・マッピングを検索します。


注意:

OracleCustomTypeMappingAttributeで指定されたUDT名には、ピリオドを使用できません。

構成ファイルのXMLを使用したカスタム・タイプ・マッピングの指定

アプリケーションは、構成ファイルのXMLを使用してカスタム・タイプ・マッピングを指定できます。たとえば、machine.configおよびWindowsアプリケーションのapp.configまたはWebアプリケーションのweb.configのいずれかを使用します。

カスタム・タイプ・マッピングは、oracle.dataaccess.client構成セクション・グループに指定される必要があります。各カスタム・タイプ・マッピングは、XML要素<add>を使用してカスタム・タイプ・マッピングのコレクションに追加される必要があります。

各カスタム・タイプ・マッピングは、名前属性および値属性で構成されます。名前属性は、カスタム・タイプ・マッピングを表す任意のユーザー固有の名前を指定できます。値属性は、udtMappingで始まり、次にリストされた必須およびオプション属性に従う必要があります。

必須属性

  • factoryName

    カスタム・タイプ・ファクトリ・クラスまたは構造体の大/小文字を区別するアセンブリ修飾名。

    カスタム・タイプ・ファクトリを定義するアセンブリにストロング・ネームがない場合、アセンブリ名のみを構成する部分的なアセンブリ名で十分です。ストロング・ネーム・アセンブリの場合、完全なアセンブリ名が必要です。アセンブリ名、VersionCulturePublicKeyTokenを含める必要があります。

  • typeName

    データベース内で定義される大/小文字を区別するUDTの名前。デフォルトでは、すべてのUDTはデータベース内に大文字で作成されます

  • schemaName

    データベース内でUDTが定義される大/小文字を区別するスキーマ。デフォルトでは、すべてのスキーマはデータベース内に大文字で作成されます

オプション属性

  • dataSource

    指定された場合、アプリケーションが接続するデータベース(TNS名別名で指定される)で定義されるOracle UDTに対してのみ、カスタム・タイプ・マッピングが適用されていることを示します。

    データ・ソースは大/小文字を区別します。

次に示す例は、.NET 2.0の構成ファイルで指定できるXMLの書式です。

 <oracle.dataaccess.client>
    <settings>
      <add name="Person" value="udtMapping factoryName='Sample.PersonFactory,
          Sample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
          typeName='PERSON' schemaName='SCOTT' dataSource='oracle'"/>
      <add name="Student" value="udtMapping factoryName='Sample.StudentFactory,
          Sample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
          typeName='STUDENT' schemaName='SCOTT'"/>
    </settings>
  </oracle.dataaccess.client>

カスタム・タイプ・マッピングの使用

データの検索中、アプリケーションはカスタム・タイプ・マッピングを使用してOracle UDTをカスタム・タイプに変換します。入力および入出力パラメータ、またはOracle REFを使用した更新によってデータが戻される場合、アプリケーションはマッピングを使用してカスタム・タイプをOracle UDTに変換します。

また、入力および入出力パラメータの場合、アプリケーションはOracleParameter UdtTypeNameプロパティをパラメータのユーザー定義のタイプ名に設定する必要があります。

Oracle UDTがタイプ階層の一部になっている場合、カスタム・タイプはタイプ階層内の固有のタイプとしてインスタンス化される必要があります。カスタム・タイプ・マッピングが指定するOracle UDTは、OracleParameter UdtTypeNameプロパティが指定するOracle UDTのサブタイプである必要があります。

たとえば、ストアド・プロシージャのパラメータはタイプSCOTT.PERSONで、サブタイプSCOTT.STUDENTを含みます。アプリケーションには、SCOTT.STUDENTを表すカスタム・クラス・インスタンスがあります。Oracle UDTをインスタンス化する際にUdtTypeNameSCOTT.PERSONに設定されますが、カスタム・タイプ・マッピングは、カスタム・クラスがSCOTT.STUDENTにマップされ、UdtTypeNameがオーバーライドされることを示します。このため、カスタム・オブジェクトがパラメータ・タイプのサブタイプであるOracle UDTを表す場合には、ODP.NETはOracle UDTを適切にインスタンス化し、バインドします。

カスタム・タイプおよびOracle UDT間の変換

ODP.NETがOracle UDTとカスタム・タイプ間で変換できるのは、適切な属性マッピングが指定され、カスタム・タイプが適切に定義されている場合です。

ODP.NETが変換を実行するのは、Oracle UDTが次に示すものとしてフェッチされる場合です。

  • SQLまたはPL/SQL実行にバインドされる入力、出力、入出力パラメータ

    OracleParameterDbTypeプロパティをDbType.Objectに設定するか、またはOracleDbTypeプロパティをOracleDbType.ObjectまたはOracleDbType.Arrayに設定する必要があります。

    ユーザー定義タイプのパラメータの場合、OracleParameterオブジェクトのUdtTypeNameプロパティを、常にパラメータ・タイプに設定する必要があります。

    注意: UdtTypeNameはカスタム・タイプ・マッピングで指定されたOracle UDTとは異なる場合があります。これは、パラメータ・タイプが、カスタム・タイプが表すOracle UDTのスーパー・タイプの場合です。

  • OracleDataReaderオブジェクトから取得される列の値

    GetValueGetValuesGetOracleValueGetOracleValuesGetProviderSpecificValueまたはGetProviderSpecificValuesメソッド、またはUDT列のItem[]プロパティのいずれかを通じてアプリケーションが値を要求する場合、ODP.NETはOracle UDTに対応するカスタム・タイプを検出し、適切に変換します。

  • DataSetを移入する結果セットの一部

    OracleDataAdapterFillメソッドを使用して、アプリケーションがUDTを含む結果を持つDataSetを移入する場合、DataSetにOracle UDTを表すカスタム・タイプが移入されます。ADO.NET 2.0の場合、OracleDataAdapterReturnProviderSpecificTypestrueまたはfalseに設定されているかどうかにかかわらず、DataSetにUDT列のカスタム・タイプが移入されます。

  • REFを通して参照されるオブジェクト

    REFが参照するオブジェクトが取得される場合、Oracle UDTを表すカスタム・タイプが戻されます。

    次のように、アプリケーションはOracleUdtFetchOptionメソッドを使用して戻されるオブジェクトのコピーを制御できます。

    • OracleUdtFetchOption.Cacheオプションが指定され、キャッシュされたオブジェクトのコピーが存在する場合、キャッシュされたコピーはすぐに戻されます。キャッシュされたコピーが存在しない場合、データベースの最新のオブジェクトのコピーがキャッシュされて戻されます。

    • OracleUdtFetchOption.Serverオプションが指定された場合、データベースの最新のオブジェクトのコピーがキャッシュされて戻されます。オブジェクトがすでにキャッシュされている場合、最新のオブジェクトのコピーは既存のオブジェクトのコピーを上書きします。

    • OracleUdtFetchOption.TransactionCacheオプションが指定された場合、同一トランザクション内では次の2つの可能性があります。

      • ServerまたはTransactionCacheオプションを使用してオブジェクトのコピーを以前に取得した場合、TransactionCacheオプションの動作はCacheオプション動作と同じになります。

      • ServerまたはTransactionCacheオプションを使用してオブジェクトのコピーを以前に取得していない場合は、TransactionCacheオプションの動作はServerオプション動作と同じになります。

Oracle UDT属性マッピング

表3-19は、Oracle UDTタイプと、.NETタイプまたはOracleプロバイダ固有のタイプ(ODP.NETタイプ)のいずれかであるカスタム・オブジェクト・タイプ間の、有効な属性(オブジェクトの場合)および要素(コレクションの場合)のマッピングをリストしています。

Oracleコレクションは、カスタム・クラスにマップする必要はありません。Oracleコレクションは、固有のタイプの配列とマップできます。表3-19は、指定されたOracleタイプの要素のコレクションで、.NETタイプまたはプロバイダ固有のタイプ配列にマップできることを示しています。たとえば、OracleコレクションがNUMBER(8)VARRAYの場合、typeof(int[])にマップできます。これにより、int[]のみ保持するクラスを作成する必要がなくなります。

.NET 2.0の場合、OracleコレクションをNullableタイプにマップできます。これにより、.NET 2.0アプリケーションはNULLを使用できるint[]を取得できるので、int[]内にNULL値を保持できます。

Oracle UDT属性および要素をobjectまたはobject[]にマップできないことに注意してください。

表3-19 UDTおよびカスタム・オブジェクト・タイプ間の属性マッピング

UDT属性または要素のタイプ .NETタイプ ODP.NETタイプ

BFILE #1

System.Byte[]

OracleBFile

BINARY FLOAT

System.Byte、System.Int16、System.Int32、System.Int64、System.Single、System.Double、 System.Decimal

OracleDecimal

BINARY DOUBLE

System.Byte、System.Int16、System.Int32、System.Int64、System.Single、System.Double、 System.Decimal

OracleDecimal

BLOB

System.Byte[]

OracleBlob

CHAR

System.Char[]System.String

OracleString

CLOB

System.Char[]System.String

OracleClob

DATE

System.DateTime

OracleDate

INTERVAL DAY TO SECOND

System.Timespan

OracleIntervalDS

INTERVAL YEAR TO MONTH

System.Int64

OracleIntervalYM

LONG RAW

System.Byte[]

OracleBinary

NCHAR

System.Char[]System.String

OracleString

NCLOB

System.Char[]System.String

OracleClob

ネストした表

custom type.NET type[]、またはcustom type[]

ODP Type[]

NUMBER

System.Byte、System.Int16、System.Int32、System.Int64、System.Single、System.Double、 System.Decimal

OracleDecimal

NVARCHAR2

System.Char[]System.String

OracleString

オブジェクト・タイプ

custom type

N/A

RAW

System.Byte[]

OracleBinary

REF

System.String

OracleRef

TIMESTAMP

System.DateTime

OracleTimeStamp

TIMESTAMP WITH LOCAL TIME ZONE

System.DateTime

OracleTimeStampLTZ

TIMESTAMP WITH TIME ZONE

System.DateTime

OracleTimeStampTZ

VARCHAR2

System.Char[]System.String

OracleString

VARRAY

custom type.NET type[]、またはcustom type[]

ODP Type[]


注意:

  1. System.Byte[]からBFILEへの変換はサポートされていないため、読取り専用の場合、System.Byte[]BFILEのみを表します。

OracleDataReaderからのOracle UDTの検索

OracleDataReaderからOracle UDTを取得するには、アプリケーションはOracle UDTを表すタイプを識別するカスタム・タイプ・マッピングを指定する必要があります。カスタム・タイプ・マッピングが指定されていて、任意の必要なカスタム・タイプが作成されている場合、アプリケーションはOracle UDTを取得できます。

表3-20は、呼び出されたメソッドに基づいてOracleDataReaderオブジェクトから戻されるタイプおよび値、列タイプ、および有効なカスタム・タイプ・マッピングがあるかどうかを示しています。


注意:

PS Objectは、プロバイダ固有のオブジェクトです。

表3-20 OracleDataReaderオブジェクトから戻されるタイプおよび値

OracleDataReaderメソッドおよびプロパティの起動 列データ型 カスタム・タイプ・マッピング Oracle UDTに戻される値 Oracle UDTに戻されるNULL値

Item[index]Item[name]GetValue()GetValues()

Object, Collection

none

スローされる例外

スローされる例外

Item[index]Item[name]GetValue()GetValues()

Object

schema.type

custom object

DBNull.Value

Item[index]Item[name]GetValue()GetValues()

Collection

schema.type

custom object | custom object[] | .NET Type[] | PS object[]

DBNull.Value

Item[index]Item[name]GetValue()GetValues()

REF

none | schema.type

string (16進)

DBNull.Value

GetString()

REF

none | schema.type

string (16進)

スローされる例外

GetProviderSpecificValue()GetProviderSpecificValues()GetOracleValue()GetOracleValues()

Object, Collection

schema.type

custom object

custom type.Null

GetProviderSpecificValue()GetProviderSpecificValues()GetOracleValue()GetOracleValues()

Collection

schema.type

custom object[] | .NET Type[] | PS object[]

null

GetProviderSpecificValue()GetProviderSpecificValues()GetOracleValue()GetOracleValues()GetOracleRef()

REF

none | schema.type

OracleRef

OracleRef.Null

GetOracleString()

REF

none | schema.type

OracleString(16進)

OracleString.Null


OracleDataReaderからのOracle UDTメタデータの検索

OracleDataReaderオブジェクトは、.NETタイプまたはプロバイダ固有のタイプ・アクセッサが呼び出される場合にメタデータを戻してカスタム・タイプがOracle UDTを表すかを判断するために使用します。OracleDataAdapter.Fillメソッドを使用してDataSetを移入する場合、同じカスタム・タイプを使用します。

表3-21は、列の.NETタイプを指定するOracleDataReader GetFieldTypeおよびGetProviderSpecificFieldTypeメソッドから戻される値を示しています。

表3-21 OracleDataReaderメソッドから戻される値

OracleDataReaderメソッドおよびプロパティの起動 列データ型 カスタム・タイプ・マッピング 戻り値

GetFieldType(index)

Object, Collection

none

スローされる例外

GetFieldType(index)

Object

schema.type

typeof(custom type)

GetFieldType(index)

Collection

schema.type

typeof(custom type) | typeof(custom type[])) | typeof(.NET type[])) | typeof(PS type[])

GetFieldType(index)

REF

none | schema.type

typeof(string)

GetProviderSpecificFieldType(index)

Object, Collection

none

スローされる例外

GetProviderSpecificFieldType(index)

Object

schema.type

typeof(custom type)

GetProviderSpecificFieldType(index)

Collection

schema.type

typeof(custom type) | typeof(custom type[])) | typeof(.NET type[])) | typeof(PS type[])

GetProviderSpecificFieldType(index)

REF

none | schema.type

typeof(OracleRef)


OracleParameterとのOracle UDTパラメータのバインド

この項では、UDT出力および入力パラメータのOracleParameterオブジェクトとのバインドの使用について説明します。

この項の内容は次のとおりです。

UDT入力および出力パラメータのバインドのガイドライン

UDTパラメータのOracleParameterオブジェクトとのバインドを使用する場合は、開発者は次のことを考慮する必要があります。

  • UdtTypeNameプロパティを設定する必要があります。UdtTypeNameプロパティに基づいているバインドは、パラメータ・ディレクションには関係ありません。


    注意:

    UdtTypeNameは、カスタム・タイプ・マッピングで指定されたOracle UDTとは異なる場合があります。これが発生するのは、パラメータ・タイプが、カスタム・タイプが表すOracle UDTのスーパー・タイプの場合です。

  • 入出力バインドの場合、その動作は入力および出力パラメータと同じになります。

  • 入力パラメータ値の場合、バインド値は、カスタム・タイプ・マッピングにより指定されたUDTに変換されます。

  • 出力パラメータの場合は次のようになります。

    • 戻り値がOracleオブジェクトまたはコレクションの場合、戻り値はカスタム・タイプ・マッピングにより指定されたカスタム・タイプまたは配列タイプに変換されます。戻り値は常にカスタム・タイプまたは配列タイプであり、プロパティの最新の設定値がDbTypeまたはOracleDbTypeであるかは関係ありません。

    • 戻り値がREFの場合、カスタム・タイプ・マッピングは不要です。

OracleParametersを指定したUDT入力パラメータのバインド

OracleParameterオブジェクトには、OracleParameterのプロパティ値、DbTypeOracleDbType、およびUdtTypeNameの特定の組合せのみ存在できます。OracleParameterオブジェクトを、リストされていない組合せに設定することはできません。

表3-22では、Oracle UDTに入力パラメータをバインドする有効な手段について説明します。

最後の列は、ODP.NETがOracleParameter値をOracleタイプに変換してからバインドするOracleタイプを示しています。

表3-22 Oracle UDTに入力パラメータをバインドする有効な手段

OracleParameter.Value OracleParameter.DbTypeまたはOracleParameter.OracleDbType OracleParameter.UdtTypeName カスタム・タイプ・マッピング バインド前に行う変換先のOracleタイプ

custom object | custom object[] | .NET object[] | PS object[]String(16進) | OracleString(16進) | OracleRef

DbType.Object | OracleDbType.Object | OracleDbType.Array | OracleDbType.Ref |

未設定

none | schema.type

スローされる例外

custom object[] | .NET object[] | PS object[]

DbType.Object | OracleDbType.Object | OracleDbType.Array

schema.type

none

スローされる例外

custom object

DbType.Object

schema.type

schema.type

指定されたUDTをインスタンス化します。値はオブジェクトまたはコレクションとして、UdtTypeNameプロパティに基づいてバインドされます

custom object

OracleDbType.Object

schema.type

schema.type

指定されたUDTをインスタンス化します。schema.typeはオブジェクトを表す必要があります。

custom object

OracleDbType.Array

schema.type

schema.type

指定されたUDTをインスタンス化します。schema.typeはコレクションを表す必要があります。

.NET object[] | PS object[] | custom object[]

DbType.Object | OracleDbType.Array

schema.type

schema.type

OracleParameter.UdtTypeNameが指定するUDTをインスタンス化します。

.NET object[] | PS object[] | custom object[]

OracleDbType.Object

schema.type

none | schema.type

スローされる例外

custom object | .NET object[] | PS object[] custom object[]

OracleDbType.Ref

schema.type

none | schema.type

スローされる例外

String(16進) | OracleString(16進) | OracleRef

DbType.Object | OracleDbType.Object | OracleDbType.Array

schema.type

none | schema.type

スローされる例外

Char[](16進) | String(16進) | OracleString(16進) | OracleRef

OracleDbType.Ref

schema.type

none | schema.type

REF


OracleParametersを指定したUDT出力パラメータのバインド

OracleParameterオブジェクトには、OracleParameterのプロパティ値、DbTypeOracleDbType、およびUdtTypeNameの特定の組合せのみ存在できます。OracleParameterオブジェクトを、リストされていない組合せに設定することはできません。

表3-23は、サポートされているODP.NETのOracleデータベース・オブジェクトの出力パラメータ・バインドを示しています。

最後の列は、ODP.NETはOracleParameter値をそのタイプに変換してからバインドする列を示しています。

表3-23 Oracle UDTに出力パラメータをバインドする有効な手段

Oracleから戻されたタイプ OracleParameter.DbType OracleParameter.UdtTypeName カスタム・タイプ・マッピング 変換先のタイプ

Object/Collection/REF

DbType.Object | OracleDbType.Object | OracleDbType.Array | OracleDbType.Ref

未設定

none | schema.type

スローされる例外

Object/Collection

DbType.Object | OracleDbType.Object | OracleDbType.Array

schema.type

none

スローされる例外

Object

DbType.Object | OracleDbType.Object

schema.type

schema.type

custom object

Object

OracleDbType.Array | OracleDbType.Ref

schema.type

none | schema.type

スローされる例外

Collection

OracleDbType.Array | DbType.Object

schema.type

schema.type

custom object | custom object[] | .NET object[] | PS object[]

Collection

OracleDbType.Ref | OracleDbType.Object

schema.type

none | schema.type

スローされる例外

REF

DbType.Object | OracleDbType.Object | OracleDbType.Array

schema.type

none | schema.type

スローされる例外

REF

OracleDbType.Ref

schema.type

none | schema.type

OracleRef


Oracle UDTでのDataSetの移入

DataSetは切断された結果セットです。ADO.NET 2.0では、.NETまたはプロバイダ固有のどちらのタイプを使用してもDataSetを移入できます。この項では、列がOracle UDTの場合にDataSetを移入するために使用するタイプについて説明します。

表3-24は、Oracle列タイプに基づくDataSet列、DataAdapterReturnProviderSpecificTypesプロパティ、既存のカスタム・タイプ・マッピング、DataSetの列タイプ、 DataSetの列の値およびDataSetの列のNULL値をリストしています。

表3-24 ADO.NET 2.0でのDataSetを移入するタイプ

Oracle列タイプ ReturnProvider-SpecificTypesプロパティ カスタム・タイプ・マッピング DataSet列タイプ DataSet列値 DataSet列NULL値

Object / Collection

False/True

none

スローされる例外

スローされる例外

スローされる例外

Object / Collection

False

schema.type

typeof(custom type)

custom object

DbNull.Value

Object / Collection

True

schema.type

typeof(custom type)

custom object

custom object.Null

Collection

False

schema.type

typeof(custom type[]) | typeof(.NET type[]) | typeof(PS type[])

.NET type[] | PS object[] | custom object[]

DbNull.Value

Collection

True

schema.type

typeof(custom type[]) | typeof(.NET type[]) | typeof(PS type[])

.NET type[] | PS object[] | custom object[]

null

REF

False

none | schema.type

typeof(string)

string/16進

DbNull.Value

REF

True

none | schema.type

typeof(OracleRef)

OracleRef

OracleRef.Null


UDTメソッドの起動

ODP.NETは、データベースのUDTに対して定義されたメソッドの起動をサポートします。次のいずれかを実行するとメソッドを起動できます。

  1. CommandTypeCommandType.StoredProcedureとして設定する。

  2. CommandText"type_name.procedure_name"として設定する

  3. 任意のExecuteメソッドをOracleCommandオブジェクトで使用してコマンドを実行する。

インスタンスのファンクションでは、パラメータは次のとおりです。

  • 最初のパラメータは戻り値にする必要があります。

  • 2番目のパラメータはインスタンス・メソッドが呼び出されるUDTインスタンスにする必要があります。これは.NETカスタム・オブジェクトのインスタンスです。

  • 後続のパラメータはファンクション用です。

インスタンスのプロシージャでは、最初のパラメータはUDTインスタンスにする必要があります。

静的メソッドでは、UDTインスタンスは不要です。

Oracle UDTの構成設定

ODP.NETは、2つの構成設定を公開してODP.NETによるOracle UDTの処理方法を決定します。

これらの構成設定は、HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Versionの下に存在する名前のレジストリ・キーを使用すれば、ODP.NETの特定バージョンに対するマシン全体の設定として指定できます。.NET Framework全体の設定についてmachine.configでエントリが作成された場合、またはアプリケーション固有の設定についてapp.configまたはweb.configでエントリが作成された場合、レジストリで指定された構成設定よりも優先されます。ODP.NETの構成の詳細は、「Oracle Data Provider for .NETの構成」を参照してください。

StatementCacheWithUdts

StatementCacheWithUdtsは、文キャッシュに戻される場合に、SELECT文によって取得されるOracle UDTをSELECT文と一緒にODP.NETがキャッシュするかどうかを指定します。戻される値は1 - Yes(デフォルト)または0 - Noです。

値が1の場合、Oracle UDTは文と一緒にキャッシュされます。そのため、UDTが含まれていたメモリーを再利用できます。その後同じ文を実行する場合には、追加メモリーは不要です。これにより全体のパフォーマンスは向上します。

値が0の場合、ODP.NETが取得されたOracle UDTのメモリーを解放してから、文は文キャッシュに戻されます。これによりパフォーマンスが低下するのは、その後の実行に新しいメモリーの割当てが必要になるためです。

UdtCacheSize

UdtCacheSizeは、Oracle UDTを取得して操作する場合にODP.NETが使用する接続ごとのオブジェクト・キャッシュのサイズを指定します。この設定値はKB単位で指定し、デフォルトは4096KB(4MB)です。

この構成設定を使用して、オブジェクト・キャッシュ・サイズ制限に達した場合にオブジェクト・キャッシュのオブジェクトが消去される頻度(LRU方式の使用)を決定します。