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データ型

BFILE

OracleBFileクラス

System.Byte[]

BINARY_DOUBLE

OracleDecimal構造

System.Decimal

BINARY_FLOAT

OracleDecimal構造

System.Decimal

BINARY_INTEGER(PL/SQLのみ)

OracleDecimal構造

System.Decimal

BLOB

OracleBlobクラス

System.Byte[]

BOOLEAN (PL/SQLのみ)

OracleBoolean構造

System.Boolean

CHAR

OracleString構造

System.String

CLOB

OracleClobクラス

System.String

DATE

OracleDate構造

System.DateTime

INTERVAL DAY TO SECOND

OracleIntervalDS構造

System.Timespan

INTERVAL YEAR TO MONTH

OracleIntervalYM構造

System.Int64

JSON

OracleString構造

System.String

LONG

OracleString構造

System.String

LONG RAW

OracleBinary構造

System.Byte[]

NCHAR

OracleString構造

System.String

NCLOB

OracleClobクラス

System.String

NUMBER

OracleDecimal構造

System.Decimal

NVARCHAR2

OracleString構造

System.String

PLS_INTEGER(PL/SQLのみ)

OracleDecimal構造

System.Decimal

RAW

OracleBinary構造

System.Byte[]

REF

OracleRefクラス

System.String

REF CURSOR(PL/SQLのみ)

OracleRefCursorクラス

適用不可

ROWID

OracleString構造

System.String

TIMESTAMP

OracleTimeStamp構造

System.DateTime

TIMESTAMP WITH LOCAL TIME ZONE

OracleTimeStampLTZ構造

System.DateTime

TIMESTAMP WITH TIME ZONE

OracleTimeStampTZ構造

System.DateTimeOffset

UROWID

OracleString構造

System.String

VARCHAR2

OracleString構造

System.String

XMLType

OracleXmlTypeクラス

System.String

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データ型の許可を有効にできます。