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

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

前 | 次 |

# OracleDataReaderオブジェクトからのデータの取得

`OracleCommand`オブジェクトの`ExecuteReader`メソッドは、`OracleDataReader`オブジェクトを戻します。このオブジェクトは、読取り専用および順方向専用の結果セットです。

この項では、`OracleDataReader`オブジェクトに関する次の情報を示します。

- OracleDataReader型指定アクセッサ

- LONGおよびLONG RAWデータの取得

- LOBデータの取得

- 1回のデータベース・ラウンドトリップでフェッチされる行数の制御

## OracleDataReader型指定アクセッサ

`OracleDataReader`クラスは、2つのタイプの型指定アクセッサを提供します。

- .NETタイプのアクセッサ

- ODP.NETタイプのアクセッサ

### .NETタイプのアクセッサ

表3-14には、ODP.NETがサポートするすべてのOracleデータベースのネイティブ・タイプと、それらに対応した、Oracleネイティブ・タイプを表す.NETタイプがリストされています。Oracleネイティブ・タイプを表すために複数の.NETタイプが使用される場合、最初の.NETタイプ・エントリは、Oracleネイティブ・タイプを最も適切に表します。3列目は、.NETタイプとして取得されるOracleネイティブ・タイプに対して起動される有効な型指定アクセッサを示します。無効な型指定アクセッサが列に使用された場合、`InvalidCastException`がスローされます。Oracleネイティブ・データ型は、データベースのバージョンに依存します。このため、Oracle Databaseの以前のバージョンでは使用できないデータ型もあります。

関連項目:

- OracleDataAdapterクラス

- OracleDataReaderクラス

表3-14 .NETタイプのアクセッサ

Oracleネイティブ・データ型 | .NETタイプ | 型指定アクセッサ
--- | --- | ---
`BFILE` | `System.Byte[]` | `GetBytes`
`BINARY_DOUBLE` | `System.Double` | `GetDouble`
`BINARY_FLOAT` | `System.Single` | `GetFloat`
`BLOB` | `System.Byte[]` | `GetBytes`
`CHAR` | `System.String` `System.Char[]` | `GetString` `GetChars`
`CLOB` | `System.String` `System.Char[]` | `GetString` `GetChars`
`DATE` | `System.DateTime` | `GetDateTime`
`INTERVAL` `DAY` `TO` `SECOND` | `System.Timespan` | `GetTimeSpan`
`INTERVAL` `YEAR` `TO` `MONTH` | `System.Int64` | `GetInt64`
`LONG` | `System.String` `System.Char[]` | `GetString` `GetChars`
`LONG RAW` | `System.Byte[``]` | `GetBytes`
`NCHAR` | `System.String` `System.Char[]` | `GetString` `GetChars`
`NCLOB` | `System.String` `System.Char[]` | `GetString` `GetChars`
`NUMBER` | `System.Decimal` `System.Byte` `System.Int16` `System.Int32` `System.Int64` `System.Single` `System.Double` | `GetDecimal` `GetByte` `GetInt16` `GetInt32` `GetInt64` `GetFloat` `GetDouble`
`NVARCHAR2` | `System.String` `System.Char[]` | `GetString` `GetChars`
`RAW` | `System.Byte[``]` | `GetBytes`
`REF` | `System.String` | `GetString`
`ROWID` | `System.String` `System.Char[]` | `GetString` `GetChars`
`TIMESTAMP` | `System.DateTime` | `GetDateTime`
`TIMESTAMP` `WITH` `LOCAL` `TIME` `ZONE` | `System.DateTime` | `GetDateTime`
`TIMESTAMP` `WITH` `TIME` `ZONE` | `System.DateTime` | `GetDateTime`
`UROWID` | `System.String` `System.Char[]` | `GetString` `GetChars`
`VARCHAR2` | `System.String` `System.Char[]` | `GetString` `GetChars`
`XMLType` | `System.String` `System.Xml.XmlReader` | `GetString` `GetXmlReader`

`OracleDataReader`オブジェクトの一部のメソッドおよびプロパティでは、列の精度とスケールに基づいて、ODP.NETで`NUMBER`列を.NETタイプにマップする必要があります。これらのメンバーは、次のとおりです。

- `Item`プロパティ

- `GetFieldType`メソッド

- `GetValue`メソッド

- `GetValues`メソッド

ODP.NETは、次の.NETタイプを順に検証して、列の値の範囲全体を表すリストの最初の.NETタイプを選択することで、適切な.NETタイプを決定します。

- `System.Byte`

- `System.Int16`

- `System.Int32`

- `System.Int64`

- `System.Single`

- `System.Double`

- `System.Decimal`

列の値の範囲全体を表す.NETタイプが存在しない場合、列値を`System.Decimal`タイプとして表そうとします。列の値を`System.Decimal`として表せない場合、例外が発生します。

たとえば、2つの列を`NUMBER(4,0)`および`NUMBER(10,2)`として定義してみます。列の値の範囲全体を表す前のリストでは、最初の.NETタイプはそれぞれ`System.Int16`と`System.Double`です。次に、列を`NUMBER(20,10)`として定義してみます。この場合、列の値の範囲全体を表す.NETタイプが存在しないため、列の値を`System.Decimal`タイプとして戻そうとします。列の値を`System.Decimal`タイプとして表せない場合、例外が発生します。

`OracleDataAdapter`の`Fill`メソッドは、`OracleDataReader`オブジェクトを使用して、.NETタイプの`DataTable`または`DataSet`を移入あるいはリフレッシュします。その結果、`DataTable`または`DataSet`の`NUMBER`列を表すために使用される.NETタイプも、その列の精度とスケールに依存します。

関連項目:

- OracleDataReaderクラス

- OracleDataAdapterクラス

- Item

- GetFieldType

- GetValues

- GetValue

### ODP.NETタイプのアクセッサ

ODP.NETは、データベースのデータ型をネイティブに表すプロバイダ固有のタイプを公開します。これらのODP.NETタイプにより、対応する.NETタイプよりもパフォーマンスおよび機能性が上回る機能が提供される場合があります。ODP.NETタイプは、それぞれの型指定アクセッサをコールすることで、`OracleDataReader`オブジェクトから取得できます。

表3-15には、ODP.NETがOracleネイティブ・タイプのODP.NETタイプを取得する際に使用する有効なタイプのアクセッサがリストされています。

表3-15 ODP.NETタイプのアクセッサ

Oracleネイティブ・データ型 | ODP.NETタイプ | 型指定アクセッサ
--- | --- | ---
`BFILE` | `OracleBFile` | `GetOracleBFile`
`BINARY_DOUBLE` | `OracleDecimal` | `GetOracleDecimal`
`BINARY_FLOAT` | `OracleDecimal` | `GetOracleDecimal`
`BLOB` | `OracleBlob` `OracleBlob` `OracleBinary` | `GetOracleBlob` `GetOracleBlobForUpdate` `GetOracleBinary`
`CHAR` | `OracleString` | `GetOracleString`
`CLOB` | `OracleClob` `OracleClob` `OracleString` | `GetOracleClob` `GetOracleClobForUpdate` `GetOracleString`
`DATE` | `OracleDate` | `GetOracleDate`
`INTERVAL` `DAY` `TO` `SECOND` | `OracleIntervalDS` | `GetOracleIntervalDS`
`INTERVAL` `YEAR` `TO` `MONTH` | `OracleIntervalYM` | `GetOracleIntervalYM`
`LONG` | `OracleString` | `GetOracleString`
`LONG` `RAW` | `OracleBinary` | `GetOracleBinary`
`NCHAR` | `OracleString` | `GetOracleString`
`NCLOB` | `OracleString` | `GetOracleString`
`NUMBER` | `OracleDecimal` | `GetOracleDecimal`
`NVARCHAR2` | `OracleString` | `GetOracleString`
`RAW` | `OracleBinary` | `GetOracleBinary`
`REF` | OracleRef | `GetOracleRef`
`ROWID` | `OracleString` | `GetOracleString`
`TIMESTAMP` | `OracleTimeStamp` | `GetOracleTimeStamp`
`TIMESTAMP` `WITH` `LOCAL` `TIME` `ZONE` | `OracleTimeStampLTZ` | `GetOracleTimeStampLTZ`
`TIMESTAMP` `WITH` `TIME` `ZONE` | `OracleTimeStampTZ` | `GetOracleTimeStampTZ`
`UROWID` | `OracleString` | `GetOracleString`
`VARCHAR2` | `OracleString` | `GetOracleString`
`XMLType` | `OracleString` `OracleXmlType` | `GetOracleString` `GetOracleXmlType`

関連項目:

すべてのODP.NETタイプのリストは、ODP.NETタイプの概要を参照してください

## LONGおよびLONG RAWデータの取得

ODP.NETは、`OracleDataReader`オブジェクトで`Read`メソッドを起動中に、データベースから行をフェッチおよびキャッシュします。この操作により取得される`LONG`および`LONG` `RAW`列データの量は、`InitialLONGFetchSize`により決定されます。`InitialLONGFetchSize`が、`0`、`0`より大きな値および`-1`に設定されている場合の動作の違いは、次の各項で説明します。

注意:

ODP.NETでは、`CommandBehavior.SequentialAccess`列挙値はサポートされていません。このため、`LONG`および`LONG` `RAW`データはランダムにフェッチできます。

### InitialLONGFetchSizeを0(ゼロ)または0(ゼロ)より大きな値に設定

`OracleDataReader`オブジェクトで`Read`メソッドを起動中に、`LONG`または`LONG` `RAW`列データに対して指定された、`InitialLONGFetchSize`の文字数またはバイト数がキャッシュに取り出されます。

デフォルトでは、`InitialLONGFetchSize`は0に設定されています。この場合ODP.NETは、`OracleDataReader` オブジェクト上での`Read`メソッドの起動中、`LONG`または`LONG` `RAW`列データのいずれもフェッチしません。データがキャッシュされないため、データベースのラウンド・トリップの原因となる`LONG`または`LONG` `RAW`列に対して型指定アクセッサ・メソッドが明示的に起動されると、`LONG`または`LONG` `RAW`データがフェッチされます。

`InitialLONGFetchSize`が`0`より大きな値に設定された場合、`OracleDataReader`オブジェクトで`Read`メソッドを起動すると、ODP.NETにより、指定された量のデータがキャッシュされます。アプリケーションが型指定アクセッサ・メソッドにより`InitialLONGFetchSize`以下のデータ量を要求した場合、データベース・ラウンドトリップは発生しません。ただし、`InitialLONGFetchSize`を超えるデータをフェッチするには、追加のデータベース・ラウンドトリップが必要です。

`InitialLONGFetchSize`文字数またはバイト数よりも多くのデータを取得するには、選択リストに次のいずれかが必要です。

- 主キー

- `ROWID`

- 一意の列 - (一意制約が定義されたか、または一意索引が作成された1セットの列として定義されたもの。セット内の少なくとも1列には、ここで定義された`NOT` `NULL`制約があります)

選択リストに主キー列(`ROWID`)または一意の列がない状態で、`LONG`または`LONG` `RAW`データ全体をフェッチするには、`OracleCommand`オブジェクトの`InitialLONGFetchSize`プロパティのサイズを、検索に必要な文字数またはバイト数以上に設定します。

`OracleDataReader`オブジェクトで適切な型指定アクセッサ・メソッド(`LONG`の場合`GetChars`、`GetOracleString`または`GetString`、`LONG` `RAW`の場合`GetOracleBinary`または`GetBytes`)がコールされたときに、`LONG`または`LONG` `RAW`データが戻されます。

### InitialLONGFetchSizeを-1に設定

`InitialLONGFetchSize`を`-1`に設定すると、選択リストに主キー、`ROWID`または一意の列を必要とせずに、SELECT問合せに対してデータベースから`LONG`または`LONG` `RAW`データ全体をフェッチできます。

`InitialLONGFetchSize`が`-1`に設定されると、`OracleDataReader`オブジェクトで`Read`メソッドを起動中に、`LONG`または`LONG` `RAW`データ全体が取り出され、キャッシュされます。`OracleDataReader`オブジェクトで`GetString`、`GetOracleString`、`GetChars`、`GetBytes`または`GetOracleBinary`をコールすると、列データ全体が戻されます。

## LOBデータの取得

ODP.NETは、`OracleDataReader`オブジェクトで`Read`メソッドを起動中に、データベースから行をフェッチおよびキャッシュします。この操作により取得されるLOB列データの量は、`InitialLOBFetchSize`により決定されます。

`InitialLOBFetchSize`が`0`、`0`より大きな値または`-1`に設定されている場合に、アプリケーションが`CLOB`列および`BLOB`列に対してコールできる型指定アクセッサ・メソッドの全リストを次に示します。

- `BLOB`列に対してコールできるメソッド

  - `GetBytes`

  - `GetValue`

  - `GetValues`

  - `GetOracleBinary`

  - `GetOracleBlob`

  - `GetOracleBlobForUpdate`

  - `GetOracleValue`

  - `GetOracleValues`

- `CLOB`列に対してコールできるメソッド

  - `GetChars`

  - `GetString`

  - `GetValue`

  - `GetValues`

  - `GetOracleString`

  - `GetOracleClob`

  - `GetOracleClobForUpdate`

  - `GetOracleValue`

  - `GetOracleValues`

次の各項では、`InitialLOBFetchSize`が、`0`、`0`より大きな値および-1に設定されている場合の動作の違いを説明します。

### InitialLOBFetchSizeを0(ゼロ)に設定

デフォルトでは、`InitialLOBFetchSize`プロパティは0です。この値では、LOBを選択した場合にそのクライアントLOBデータのフェッチを`OracleDataReader` `Read`の後まで(アクセッサを使用した場合など)遅延するようODP.NETに指定します。LOBの各値は、個々にアクセスされた時点にのみ取得されます。

このような取得方法を使用する利点は、クライアントのメモリーおよび帯域幅が節約されるということです。選択したLOBがきわめて大きい、またはエンド・ユーザーがすぐには使用する必要がない場合、あるいはその両方の場合、すべて同時ではなく必要に応じてLOBを取得する方がアプリケーションのパフォーマンスが向上します。

### InitialLOBFetchSizeを0(ゼロ)より大きな値に設定

`InitialLOBFetchSize`を`0`より大きな値に設定すると、`OracleDataReader`オブジェクトに対する`Read`メソッドを起動中に、ODP.NETにより、選択された各LOBに対して`InitialLOBFetchSize`の文字数またはバイト数までのLOBデータがキャッシュされます。最大値は2,147,483,647 (2GB)です。選択したLOBの合計サイズがこの数値より小さい場合は、LOBデータ全体が読み取られます。

1回または複数回のデータベース・ラウンドトリップですべてのLOBエントリをプリフェッチすると、ラウンドトリップが減るためアプリケーションのパフォーマンスが向上します。このアプローチは、大部分のLOBが小さい、またはエンド・ユーザーがほぼ即時に使用する場合、あるいはその両方の場合に最も利点を発揮します。フェッチ・サイズが大きくなるとメモリー消費量が増えるのが欠点です。

この項では、キャッシュされる`InitialLOBFetchSize`文字数またはバイト数よりも多くのデータをフェッチする方法について説明します。

`InitialLOBFetchSize`プロパティに設定された値に関係なく、型指定アクセッサが起動されると残りのLOBデータが戻されます。指定された`InitialLOBFetchSize`よりも多くのデータを取得するために、主キー、`ROWID`または一意の列を問合せ選択リストに含める必要はありません。

`InitialLOBFetchSize`が`0`より大きな値であっても、`GetOracleBlob`、`GetOracleClob`、`GetOracleBlobForUpdate`および`GetOracleClobForUpdate`メソッドを起動できるようになりました。

### InitialLOBFetchSizeを-1に設定

読取り操作中に選択し、設定したLOB当たり制限によって検出されていないすべてのLOBデータをフェッチするには、`InitialLOBFetchSize`を`-1`に設定します。ODP.NETリリース12.1.0.2以上では、`InitialLobFetchSize`を`-1`に設定したときの新しいデフォルト動作が導入されました。

`LegacyEntireLOBFetch = 0`のとき(デフォルト値)、LOB列で次の操作が呼び出されます。

- `OracleDataReader.GetOracleClob()`: `OracleClob`オブジェクトを返します。

- `OracleDataReader.GetOracleBlob()` : returns `OracleBlob`オブジェクトを返します。

- `OracleDataReader.GetOracleClobForUpdate()`: `OracleClob`オブジェクトを返します。

- `OracleDataReader.GetOracleBlobForUpdate()`: `OracleBlob`オブジェクトを返します。

- `OracleDataReader.GetOracleValue()`: CLOB列に対して`OracleClob`オブジェクトを返します。

- `OracleDataReader.GetOracleValue()`: BLOB列に対して`OracleBlob`オブジェクトを返します。

- `OracleDataAdapter.Fill()`で`ProviderSpecificTypes=true`に設定: `CLOB`列を`OracleClob`にして`DataTable`に移入します。

- `OracleDataAdapter.Fill()`で`ProviderSpecificTypes=true`に設定: `BLOB`列を`OracleBlob`にして`DataTable`に移入します。

以前の動作を使用する場合は、ODP.NET構成で`LegacyEntireLobFetch = 1`に設定します。

`LegacyEntireLobFetch = 1`で`InitialLOBFetchSize = -1`の場合、`GetOracleClob`、`GetOracleClobForUpdate`、`GetOracleBlob`、`GetOracleBlobForUpdate`の各メソッドはサポートされません。次の操作は、このシナリオでLOB列のために呼び出されます。

- `OracleDataReader.GetOracleClob()`: `InvalidCastException()`をスローします。

- `OracleDataReader.GetOracleBlob()`: `InvalidCastException()`をスローします。

- `OracleDataReader.GetOracleClobForUpdate()`: `InvalidCastException()`をスローします。

- `OracleDataReader.GetOracleBlobForUpdate()`: `InvalidCastException()`をスローします。

- `OracleDataReader.GetOracleValue()`: `CLOB`列に対して`OracleString`オブジェクトを返します。

- `OracleDataReader.GetOracleValue()`: `BLOB`列に対して`OracleBinary`オブジェクトを返します。

- `OracleDataAdapter.Fill()`で`ProviderSpecificTypes=true`に設定: `CLOB`列を`OracleString`にして`DataTable`に移入します。

- `OracleDataAdapter.Fill()`で`ProviderSpecificTypes=true`に設定: `BLOB`列を`OracleBinary`にして`DataTable`に移入します。

ODP.NET 12.1.0.2以前のリリースでは、`InitialLOBFetchSize`を`-1`に設定することで、選択リストに主キー、`ROWID`または一意の列がない場合も、SELECT問合せに対してデータベースからLOBデータ全体をフェッチできます。`InitialLOBFetchSize`が`-1`に設定されると、`OracleDataReader`オブジェクトで`Read`メソッドを起動中に、LOB列データ全体がフェッチおよびキャッシュされます。`OracleDataReader`オブジェクトで`GetString`、`GetOracleString`、`GetChars`、`GetBytes`または`GetOracleBinary`をコールすると、すべてのデータを取得できます。

#### InitialLOBFetchSizeが-1でLegacyEntireLobFetchが1のときにサポートされるメソッド

この項では、`InitialLOBFetchSize`プロパティが`-1`に設定され、`LegacyEntireLobFetch`プロパティが`1`に設定されている場合に、`CLOB`および`BLOB`データ型に対してサポートされているメソッドとサポートされていないメソッドをリストしています。

表3-16では、`CLOB`データ型に対してサポートされているメソッドとサポートされていないメソッドをリストしています。

表3-16 InitialLOBFetchSizeが-1でLegacyEntireLobFetchが1のときにサポートされるOracleDataReader CLOBメソッド

OracleDataReader CLOBメソッド | サポート対象
--- | ---
`GetChars` | はい
`GetString` | はい
`GetValue` | はい
`GetValues` | はい
`GetOracleString` | はい
`GetOracleValue` | はい
`GetOracleValues` | はい
`GetOracleClob` | いいえ
`GetOracleClobForUpdate` | いいえ

表3-17では、`BLOB`データ型に対してサポートされているメソッドとサポートされていないメソッドをリストしています。

表3-17 InitialLOBFetchSizeが-1でLegacyEntireLobFetchが1のときにサポートされるOracleDataReader BLOBメソッド

OracleDataReader BLOBメソッド | サポート対象
--- | ---
`GetBytes` | はい
`GetValue` | はい
`GetValues` | はい
`GetOracleBinary` | はい
`GetOracleValue` | はい
`GetOracleValues` | はい
`GetOracleBlob` | いいえ
`GetOracleBlobForUpdate` | いいえ

### InitialLOBFetchSizeプロパティに関連したパフォーマンス上の考慮事項

この項では、異なる状況における、`InitialLOBFetchSize`プロパティの様々な設定のメリットおよびデメリットについて説明します。

アプリケーションで、パフォーマンスと`OracleBlob`および`OracleClob`機能のどちらをとるかを選択する必要はありません。`InitialLOBFetchSize`プロパティを設定すると、パフォーマンスは向上し、`OracleBlob`オブジェクトおよび`OracleClob`オブジェクトを使用する自由度はそのままです。

LOBデータのサイズが不明であったり、LOBデータのサイズが不規則に変化する場合は、`InitialLOBFetchSize`プロパティをデフォルト値の`0`のままにしてください。これでも、ほとんどの場合でパフォーマンスが改善されます。

大部分の行について`InitialLOBFetchSize`プロパティのサイズをLOBデータ・サイズ以上に設定すると、パフォーマンスが劇的に改善されます。通常、`InitialLOBFetchSize`プロパティは、問合せで戻される行の80%以上のLOBデータのサイズより大きい値に設定することをお薦めします。たとえば、LOBデータのサイズが行の80%で1KB未満で、行の20%で1MB以上である場合、`InitialLOBFetchSize`プロパティを1KBに設定します。

関連項目:

- LOBサポート

- InitialLOBFetchSize

- InitialLONGFetchSize

## 1回のデータベース・ラウンドトリップでフェッチされる行数の制御

アプリケーションのパフォーマンスは、アプリケーションがフェッチする必要のある行数と、行の検索に必要なデータベース・ラウンドトリップの回数に依存します。

### FetchSizeの使用

`FetchSize`プロパティは、データベース・ラウンドトリップからフェッチされたデータをキャッシュするためにODP.NETが割り当てるメモリー・サイズの合計をバイトで表したものです。

`FetchSize`プロパティは、状況に応じて`OracleCommand`、`OracleDataReader`または`OracleRefCursor`オブジェクトで設定できます。これは、`OracleDataAdapter`を使用して`DataSet`または`DataTable`に移入を行う場合のフェッチ・サイズを制御します。

`FetchSize`プロパティを`OracleCommand`オブジェクトで設定した場合、新しく作成された`OracleDataReader`は、`OracleCommand`オブジェクトの`FetchSize`プロパティを継承します。この継承された`FetchSize`は、そのままにしておくか、継承された値を上書きするように変更できます。`OracleDataReader`オブジェクトの`FetchSize`プロパティは、最初の`Read`メソッドを起動する前に変更できます。このメソッドは、`FetchSize`プロパティで指定されたメモリーを割り当てます。データベースからの後続のフェッチはすべて、その`OracleDataReader`に割り当てられた同じキャッシュを使用します。このため、最初の`Read`メソッドを起動した後に`FetchSize`を変更しても影響はありません。

### FetchSizeの微調整

`FetchSize`プロパティを微調整することで、アプリケーションは、メモリー使用率、および1回のデータベース・ラウンドトリップでフェッチされる行数を制御して、パフォーマンスを向上させることができます。

たとえば、問合せが100行を戻し、各行が1024バイトある場合、`FetchSize`プロパティを102400に設定すると、1回のデータベース・ラウンドトリップで100行をフェッチできます。同じ問合せで、`FetchSize`プロパティを10240に設定すると、100行を検索するのに10回のデータベース・ラウンドトリップが必要になります。アプリケーションが結果セットからすべての行をフェッチする必要がある場合、最初の使用例の方が2番目の使用例より高速になります。ただし、アプリケーションが結果セットから最初の10行のみをフェッチする必要がある場合、100行ではなく10行のみをフェッチするため、2番目の使用例の方がパフォーマンスが向上します。次の10行をフェッチする場合、行1から10に割り当てられたメモリーが行11から20で再び使用されます。

`FetchSize`が大きいほど、より多くのシステム・メモリーが使用されます。クライアント・システムのメモリー・リソースに制限がある場合、開発者は大きなフェッチ・サイズを設定できません。

### RowSizeプロパティの使用

`OracleCommand`または`OracleRefCursor`オブジェクトの`RowSize`プロパティには、`SELECT`文の実行後に行サイズ(バイト)が移入されます。`FetchSize`プロパティは、`RowSize`値とデータベース・ラウンドトリップごとにフェッチされる行数の積に設定することで、`RowSize`プロパティに応じた値に設定できます。

たとえば、`FetchSize`を`RowSize` * 10に設定すると、`OracleDataReader`オブジェクトでは、データベース・ラウンドトリップごとに10行のみが強制的にフェッチされます。各列のデータ長によって`RowSize`が変わることはありません。`RowSize`は、`SELECT`文が実行されるデータベース表のメタデータ情報から正確に決定されます。

`RowSize`プロパティを使用すると、次の項で説明するように、設計時または実行時に`FetchSize`プロパティを設定できます。

#### レジストリ内のFetchSize値の設定

`HKLM\Software\Oracle\ODP.NET\``version``\FetchSize`レジストリ・エントリは、特定のバージョンのODP.NETを使用するすべてのアプリケーションに対するデフォルトの結果セットのフェッチ・サイズをバイト単位で指定するように設定できます。または、アプリケーション構成ファイルまたは`web.config`ファイルの`FetchSize`属性で、特定のアプリケーションに対するデフォルト値を指定できます。デフォルトのフェッチ・サイズは131072バイトです。この値は、実行時にアプリケーションの`FetchSize`プロパティを`OracleCommand`または`OracleDataReader`に対してプログラムで設定することによって無視できます。

#### 設計時のFetchSize値の設定

特定の`SELECT`文の行サイズが前の実行ですでにわかっている場合、`OracleCommand`オブジェクトの`FetchSize`値は、設計時に、その行サイズとアプリケーションがデータベース・ラウンドトリップごとにフェッチする必要がある行数の積に設定できます。`OracleCommand`オブジェクトの`FetchSize`値セットは、`OracleCommand`オブジェクトで`ExecuteReader`メソッドを起動したときに作成された`OracleDataReader`オブジェクトにより継承されます。`OracleCommand`オブジェクトで`FetchSize`値を設定するのではなく、`OracleDataReader`オブジェクトで直接`FetchSize`値を設定することもできます。いずれの場合にも、実行時に`RowSize`プロパティ値にアクセスしなくても、`FetchSize`は設計時に設定されます。

#### 実行時のFetchSize値の設定

設計時に行サイズがわからないアプリケーションでは、`OracleCommand`オブジェクトの`RowSize`プロパティを使用して、`OracleDataReader`オブジェクトの`FetchSize`プロパティを設定できます。`RowSize`プロパティは、行のサイズに基づいて、動的な方法で`FetchSize`プロパティを設定します。

`OracleCommand`オブジェクトで`ExecuteReader`メソッドを起動して`OracleDataReader`オブジェクトを取得した後に、`RowSize`プロパティが行のサイズ(バイト)とともに移入されます。`RowSize`プロパティを使用することで、アプリケーションは、`OracleDataReader`オブジェクトの`FetchSize`プロパティを、`RowSize`プロパティ値とアプリケーションがデータベース・ラウンドトリップごとにフェッチする必要がある行数の積に動的に設定できます。この使用例では、実行時に`RowSize`プロパティにアクセスすることで`FetchSize`が設定されます。