ODP.NETタイプの概要
ODP.NETタイプは、Oracleネイティブ・データ型およびPL/SQLデータ型を構造体またはクラスとして表します。ODP.NETタイプの構造体は値セマンティクスに従い、ODP.NETタイプのクラスは参照セマンティクスに従っています。.NETタイプと比べ、ODP.NETタイプは.NETアプリケーションでOracleのネイティブ・データおよびPL/SQLデータ型を取得する、より安全で効率的な方法を提供します。たとえば、OracleDecimal構造では最大38桁の精度を保持できますが、.NET Decimalでは最大28桁の精度しか保持できません。
表3-14には、ODP.NETによりサポートされているすべてのデータ型とそれらに対応するODP.NETタイプがリストされています。1列目のデータ型は、その名前のOracleネイティブ・データ型およびPL/SQLデータ型を参照します。PL/SQLにのみ存在するデータ型は、データ型の名前の後の(PL/SQLのみ)で示されています。また、PL/SQLデータ型のエントリは、データ型のサブタイプも表します(ある場合)。第3列には、各ODP.NETタイプのValueプロパティに対応する.NET Frameworkデータ型がリストされています。
表3-14 ODP.NETタイプのValueプロパティのタイプ
| Oracleネイティブ・データ型またはPL/SQLデータ型 | ODP.NETタイプ | .NET Frameworkデータ型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
適用不可 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ODP.NETタイプのDataSetおよびDataTableへのデシリアライズ
アプリケーション・セキュリティを強化するためにすべての.NETバージョンが変更されたため、許可されたデシリアライズ可能なDataSetおよびDataTableデータ型が制限されるようになりました。この変更は、.NET 5および.NET Coreと.NET Frameworkの更新に適用されます。DataSetsおよびDataTablesがこれらの新しい.NETバージョンのいずれかでOracleデータ型を使用する場合、ODP.NET固有のデータ型を許可リストに追加して、DataSetまたはDataTableにデシリアライズできるようにする必要があります。ODP.NET固有のタイプを許可リストに追加せずにデシリアライズしようとすると、ODP.NETタイプ・イニシャライザ例外が発生します。
すべてのODP.NETデータ型を許可リストに追加して、アプリケーションでOracleConfiguration AddOracleTypesDeserializationメソッドをコールする最も簡単な方法です。
また、.NET Framework 4では、特定のODP.NETデータ型をアプリケーションの.NET構成ファイルに個別に追加できます。次に、すべての管理対象ODP.NET 21cデータ型を許可リストに追加するためのサンプル構成ファイルを示します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="system.data.dataset.serialization" type="System.Data.SerializationSettingsSectionGroup, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="allowedTypes" type="System.Data.AllowedTypesSectionHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</sectionGroup>
</configSections>
<system.data.dataset.serialization>
<allowedTypes>
<!-- <add type="assembly qualified type name" /> -->
<add type="Oracle.ManagedDataAccess.Types.OracleBinary, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleBlob, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleClob, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleDate, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleDecimal, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleIntervalDS, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleIntervalYM, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleRef, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleString, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleTimeStamp, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleTimeStampLTZ, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleTimeStampTZ, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<add type="Oracle.ManagedDataAccess.Types.OracleXmlType, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<!-- additional <add /> elements as needed -->
</allowedTypes>
</system.data.dataset.serialization>
</configuration>
.NET構成ファイルを使用すると、開発者は、AddOracleTypesDeserializationメソッドですべてのODP.NETデータ型を有効にするのではなく、特定のODP.NETデータ型の許可を有効にできます。