ODP.NETには、データベース内のOracle UDTを、.NETアプリケーションのカスタム・タイプとして表す機能があります。UDTはアプリケーション間で共有できる単一オブジェクトとして複雑な実体を表すのに便利です。Oracle製品(Oracle SpatialおよびOracle XML DBなど)では、製品独自の複雑なタイプを頻繁に使用しています。
Oracle UDTを.NETカスタム・タイプとして表すには、アプリケーションに.NET属性をカスタム・クラスおよび構造体、そしてそれらのパブリック・フィールドおよびプロパティに適用します。
注意: ODP.NET管理対象ドライバは、UDTおよび.NETカスタム・タイプをサポートしていません。 |
UDTおよびカスタム・タイプ間で変換するには、ODP.NETはカスタム・インタフェースを使用します。
このセクションの内容は次のとおりです。
Oracle Data Provider for .NETは、Oracleオブジェクト型またはユーザー定義タイプ(UDT)をサポートしており、Oracle Databaseに定義されています。
次の2種類のUDTがあります。
オブジェクト・タイプ(Oracleオブジェクト)
コレクション・タイプ(VARRAY
タイプまたはネスト表タイプ)
また、ODP.NETはオブジェクト・タイプに対して参照(REF
)をサポートしています。
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コレクション型の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
から指定する必要があります。
カスタム・タイプの作成後、アプリケーションはカスタム・タイプ・マッピングを指定し、カスタム・タイプをデータベース内のOracle UDTにマップする必要があります。これは、カスタム・タイプ・ファクトリまたは構成ファイルにあるXMLを使用して実行できます。
この両方が実装されている場合は、XMLを使用したカスタム・タイプ・マッピングの指定が優先されます。実行時に、構成ファイルで指定されたカスタム・タイプ・マッピングがODP.NETによって検出されると、OracleCustomTypeMappingAttribute
オブジェクトを使用して指定されたカスタム・タイプ・マッピングは無視されます。
カスタム・タイプ・マッピングの場合、マッピングがOracleCustomTypeMappingAttribute
オブジェクトまたはXML構成ファイルによるものかどうかにかかわらず、シノニムの使用を指定することはできません。
関連項目: UDTマッピングの詳細は、Oracle Developer Tools for Visual StudioヘルプのServer Explorer for Visual Studio 2005およびOracle Explorer for Visual Studio 2003の項にあるユーザー定義タイプ・ノードに関する項を参照してください。 |
この項の内容は次のとおりです。
アプリケーションは、カスタム・タイプ・ファクトリを使用してカスタム・タイプ・マッピングを指定できます。アプリケーションはschema_name.type_name
の形式でOracleCustomTypeMappingAttribute
オブジェクトにOracle UDTの名前を指定し、その名前を対応するカスタム・タイプ・ファクトリに適用します。カスタム・タイプ・ファクトリはクラスまたは構造体であり、IOracleCustomTypeFactory
およびIOracleArrayTypeFactory
インタフェースのいずれかまたは両方を実装しています。
アプリケーションが使用する各Oracle UDTは、必ず一意のカスタム・タイプ・ファクトリであることに注意してください。さらに、Oracleオブジェクト型では、カスタム・タイプ・ファクトリは指定されたOracleオブジェクト型を一意に表すカスタム・タイプを戻す必要があります。Oracleコレクション型では、カスタム・タイプ・ファクトリは、他のOracleコレクション型が使用できるカスタム・タイプを戻します。これは、配列タイプのカスタム・タイプがOracleコレクションを表す場合、つまりint[]
を使用してNUMBER
のコレクションを表す場合に共通です。
実行時にリフレクション・プログラミングを使用すると、OracleCustomTypeMappingAttribute
オブジェクトを通して、ODP.NETはアプリケーションが指定するすべてのカスタム・タイプ・マッピングを検索します。
注意: OracleCustomTypeMappingAttribute で指定されたUDT名には、ピリオドを使用できません。 |
アプリケーションは、構成ファイルの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を適切にインスタンス化し、バインドします。
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
オプション動作と同じになります。
表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タイプ |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ネストした表 |
|
|
|
|
|
|
|
|
オブジェクト・タイプ |
|
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意:
System.Byte[]
からBFILE
への変換はサポートされていないため、読取り専用の場合、System.Byte[]
はBFILE
のみを表します。
OracleDataReader
からOracle UDTを取得するには、アプリケーションはOracle UDTを表すタイプを識別するカスタム・タイプ・マッピングを指定する必要があります。カスタム・タイプ・マッピングが指定されていて、任意の必要なカスタム・タイプが作成されている場合、アプリケーションはOracle UDTを取得できます。
表3-20は、呼び出されたメソッドに基づいてOracleDataReader
オブジェクトから戻されるタイプおよび値、列タイプ、および有効なカスタム・タイプ・マッピングがあるかどうかを示しています。
注意: PS Object は、プロバイダ固有のオブジェクトです。 |
表3-20 OracleDataReaderオブジェクトから戻されるタイプおよび値
OracleDataReaderメソッドおよびプロパティの起動 | 列データ型 | カスタム・タイプ・マッピング | Oracle UDTに戻される値 | Oracle UDTに戻されるNULL値 |
---|---|---|---|---|
|
|
none |
スローされる例外 |
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
|
|
none | |
|
|
|
|
none | |
|
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
|
|
none | |
|
|
|
|
none | |
|
|
OracleDataReader
オブジェクトは、.NETタイプまたはプロバイダ固有のタイプ・アクセッサが呼び出される場合にメタデータを戻してカスタム・タイプがOracle UDTを表すかを判断するために使用します。OracleDataAdapter.Fill
メソッドを使用してDataSet
を移入する場合、同じカスタム・タイプを使用します。
表3-21は、列の.NETタイプを指定するOracleDataReader
GetFieldType
およびGetProviderSpecificFieldType
メソッドから戻される値を示しています。
表3-21 OracleDataReaderメソッドから戻される値
OracleDataReaderメソッドおよびプロパティの起動 | 列データ型 | カスタム・タイプ・マッピング | 戻り値 |
---|---|---|---|
|
|
none |
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
none | |
|
|
|
none |
スローされる例外 |
|
|
|
|
|
|
|
|
|
|
none | |
|
この項では、UDT出力および入力パラメータのOracleParameter
オブジェクトとのバインドの使用について説明します。
この項の内容は次のとおりです。
UDTパラメータのOracleParameter
オブジェクトとのバインドを使用する場合は、開発者は次のことを考慮する必要があります。
UdtTypeName
プロパティを設定する必要があります。UdtTypeName
プロパティに基づいているバインドは、パラメータ・ディレクションには関係ありません。
注意: UdtTypeName は、カスタム・タイプ・マッピングで指定されたOracle UDTとは異なる場合があります。これが発生するのは、パラメータ・タイプが、カスタム・タイプが表すOracle UDTのスーパー・タイプの場合です。 |
入出力バインドの場合、その動作は入力および出力パラメータと同じになります。
入力パラメータ値の場合、バインド値は、カスタム・タイプ・マッピングにより指定されたUDTに変換されます。
出力パラメータの場合は次のようになります。
戻り値がOracleオブジェクトまたはコレクションの場合、戻り値はカスタム・タイプ・マッピングにより指定されたカスタム・タイプまたは配列タイプに変換されます。戻り値は常にカスタム・タイプまたは配列タイプであり、プロパティの最新の設定値がDbType
またはOracleDbType
であるかは関係ありません。
戻り値がREF
の場合、カスタム・タイプ・マッピングは不要です。
OracleParameter
オブジェクトには、OracleParameter
のプロパティ値、DbType
、OracleDbType
、およびUdtTypeName
の特定の組合せのみ存在できます。OracleParameter
オブジェクトを、リストされていない組合せに設定することはできません。
表3-22では、Oracle UDTに入力パラメータをバインドする有効な手段について説明します。
最後の列は、ODP.NETがOracleParameter
値をOracleタイプに変換してからバインドするOracleタイプを示しています。
表3-22 Oracle UDTに入力パラメータをバインドする有効な手段
OracleParameter.Value | OracleParameter.DbTypeまたはOracleParameter.OracleDbType | OracleParameter.UdtTypeName | カスタム・タイプ・マッピング | バインド前に行う変換先のOracleタイプ |
---|---|---|---|---|
|
|
未設定 |
none | |
スローされる例外 |
|
|
|
none |
スローされる例外 |
|
|
|
|
指定されたUDTをインスタンス化します。値はオブジェクトまたはコレクションとして、 |
|
|
|
|
指定されたUDTをインスタンス化します。 |
|
|
|
|
指定されたUDTをインスタンス化します。 |
|
|
|
|
|
|
|
|
none | |
スローされる例外 |
|
|
|
none | |
スローされる例外 |
|
|
|
none | |
スローされる例外 |
Char[](16進) | |
|
|
none | |
|
OracleParameter
オブジェクトには、OracleParameter
のプロパティ値、DbType
、OracleDbType
、およびUdtTypeName
の特定の組合せのみ存在できます。OracleParameter
オブジェクトを、リストされていない組合せに設定することはできません。
表3-23は、サポートされているODP.NETのOracleデータベース・オブジェクトの出力パラメータ・バインドを示しています。
最後の列は、ODP.NETはOracleParameter
値をそのタイプに変換してからバインドする列を示しています。
表3-23 Oracle UDTに出力パラメータをバインドする有効な手段
Oracleから戻されたタイプ | OracleParameter.DbType | OracleParameter.UdtTypeName | カスタム・タイプ・マッピング | 変換先のタイプ |
---|---|---|---|---|
|
|
未設定 |
none | |
スローされる例外 |
|
|
|
none |
スローされる例外 |
|
|
|
|
|
|
|
|
none | |
スローされる例外 |
|
|
|
|
|
|
|
|
none | |
スローされる例外 |
|
|
|
none | |
スローされる例外 |
|
|
|
none | |
|
DataSet
は切断された結果セットです。ADO.NET 2.0では、.NETまたはプロバイダ固有のどちらのタイプを使用してもDataSet
を移入できます。この項では、列がOracle UDTの場合にDataSet
を移入するために使用するタイプについて説明します。
表3-24は、Oracle列タイプに基づくDataSet
列、DataAdapter
のReturnProviderSpecificTypes
プロパティ、既存のカスタム・タイプ・マッピング、DataSet
の列タイプ、DataSet
の列の値およびDataSet
の列のNULL値をリストしています。
表3-24 ADO.NET 2.0でのDataSetを移入するタイプ
Oracle列タイプ | ReturnProvider-SpecificTypesプロパティ | カスタム・タイプ・マッピング | DataSet列タイプ | DataSet列値 | DataSet列NULL値 |
---|---|---|---|---|---|
|
|
none |
スローされる例外 |
スローされる例外 |
スローされる例外 |
|
|
schema.type |
|
|
|
|
|
schema.type |
|
|
|
|
|
schema.type |
|
|
|
|
|
schema.type |
|
|
|
|
|
none | schema.type |
|
|
|
|
|
none | schema.type |
|
|
|
ODP.NETは、データベースのUDTに対して定義されたメソッドの起動をサポートします。次のいずれかを実行するとメソッドを起動できます。
CommandType
をCommandType.StoredProcedure
として設定する。
CommandText
を"
type_name.procedure_name
"
として設定する
任意のExecute
メソッドをOracleCommand
オブジェクトで使用してコマンドを実行する。
インスタンスのファンクションでは、パラメータは次のとおりです。
最初のパラメータは戻り値にする必要があります。
2番目のパラメータはインスタンス・メソッドが呼び出されるUDTインスタンスにする必要があります。これは.NETカスタム・オブジェクトのインスタンスです。
後続のパラメータはファンクション用です。
インスタンスのプロシージャでは、最初のパラメータはUDTインスタンスにする必要があります。
静的メソッドでは、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
は、文キャッシュに戻される場合に、SELECT
文によって取得されるOracle UDTをSELECT文と一緒にODP.NETがキャッシュするかどうかを指定します。戻される値は1
- Yes(デフォルト)または0 - Noです。
値が1の場合、Oracle UDTは文と一緒にキャッシュされます。そのため、UDTが含まれていたメモリーを再利用できます。その後同じ文を実行する場合には、追加メモリーは不要です。これにより全体のパフォーマンスは向上します。
値が0の場合、ODP.NETが取得されたOracle UDTのメモリーを解放してから、文は文キャッシュに戻されます。これによりパフォーマンスが低下するのは、その後の実行に新しいメモリーの割当てが必要になるためです。
UdtCacheSize
は、Oracle UDTを取得して操作する場合にODP.NETが使用する接続ごとのオブジェクト・キャッシュのサイズを指定します。この設定値はKB単位で指定し、デフォルトは4096KB(4MB)です。
この構成設定を使用して、オブジェクト・キャッシュ・サイズ制限に達した場合にオブジェクト・キャッシュのオブジェクトが消去される頻度(LRU方式の使用)を決定します。