プライマリ・コンテンツに移動

Oracle® Data Provider for .NET開発者ガイド ODAC 12.2c リリース1 (12.2.0.1) for Microsoft Windows E88311-03 |
| 目次 | 索引

前 | 次 |

# 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 UDT間の変換

- Oracle UDT属性マッピング

- OracleDataReaderからのOracle UDTの検索

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

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

- Oracle UDTでのDataSetの移入

- Oracle UDTメソッドの起動

- Oracle UDTの構成設定

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

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

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

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

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

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

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

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

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

関連項目:

- OracleRefクラス

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

## カスタム・タイプ

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コレクション型の`NUMBER`を`int[]`にマッピングできます。さらに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`から指定する必要があります。

関連項目:

- IOracleCustomTypeインタフェース

- OracleRefクラス

- IOracleCustomTypeFactoryインタフェース

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

カスタム・タイプの作成後、アプリケーションはカスタム・タイプ・マッピングを指定し、カスタム・タイプをデータベース内の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にあるユーザー定義タイプ・ノードに関する項を参照してください。

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

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

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

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

アプリケーションは、カスタム・タイプ・ファクトリを使用してカスタム・タイプ・マッピングを指定できます。アプリケーションは`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`

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

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

- `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をインスタンス化する際に`UdtTypeName`は`SCOTT.PERSON`に設定されますが、カスタム・タイプ・マッピングは、カスタム・クラスが`SCOTT.STUDENT`にマップされ、`UdtTypeName`がオーバーライドされることを示します。このため、カスタム・オブジェクトがパラメータ・タイプのサブタイプであるOracle UDTを表す場合には、ODP.NETはOracle UDTを適切にインスタンス化し、バインドします。

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

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

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

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

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

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

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

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

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

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

  `OracleDataAdapter`の`Fill`メソッドを使用して、アプリケーションがUDTを含む結果を持つ`DataSet`を移入する場合、`DataSet`にOracle UDTを表すカスタム・タイプが移入されます。ADO.NET 2.0の場合、`OracleDataAdapter`の`ReturnProviderSpecificTypes`が`true`または`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-21は、Oracle UDTタイプと、.NETタイプまたはOracleプロバイダ固有のタイプ(ODP.NETタイプ)のいずれかであるカスタム・オブジェクト・タイプ間の、有効な属性(オブジェクトの場合)および要素(コレクションの場合)のマッピングをリストしています。

Oracleコレクションは、カスタム・クラスにマップする必要はありません。Oracleコレクションは、固有のタイプの配列とマップできます。表3-21は、指定された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-21 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-22は、呼び出されたメソッドに基づいて`OracleDataReader`オブジェクトから戻されるタイプおよび値、列タイプ、および有効なカスタム・タイプ・マッピングがあるかどうかを示しています。

注意:

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

表3-22 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オブジェクトからのデータの取得

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

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

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

表3-23 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入力および出力パラメータのバインドのガイドライン

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

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

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

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

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

  注意:

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

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

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

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

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

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

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

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

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

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

表3-24 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`のプロパティ値、`DbType`、`OracleDbType`、および`UdtTypeName`の特定の組合せのみ存在できます。`OracleParameter`オブジェクトを、リストされていない組合せに設定することはできません。

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

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

表3-25 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`

関連項目:

- パラメータ・バインド

- OracleDataReader型指定アクセッサ

## Oracle UDTでのDataSetの移入

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

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

表3-26 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. `CommandType`を`CommandType.StoredProcedure`として設定する。

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

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

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

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

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

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

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

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

## Oracle UDTの構成設定

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

- StatementCacheWithUdts

- UdtCacheSize

これらの構成設定は、`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方式の使用)を決定します。