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

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

前 | 次 |

# LOBサポート

ODP.NETは、ラージ・オブジェクト(LOB)データ型にアクセスして操作するための簡単かつ最適な方法を提供します。

注意:

SecureFilesは既存のODP.NET LOBクラスとともに使用できます。

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

- ラージ・キャラクタ・データ型とラージ・バイナリ・データ型

- Oracle Data Provider for .NET LOBオブジェクト

- DataSetを使用したLOBの更新

- OracleCommandおよびOracleParameterを使用したLOBの更新

- ODP.NET LOBオブジェクトを使用したLOBの更新

- 一時LOB

## ラージ・キャラクタ・データ型とラージ・バイナリ・データ型

Oracle Databaseは、ラージ・キャラクタ・データ型とラージ・バイナリ・データ型をサポートしています。

ラージ・キャラクタ・データ型

- `CLOB` - キャラクタ・データを4GBまで格納できます。

- `NCLOB` - Unicode各国語キャラクタ・セット・データを4GBまで格納できます。

ラージ・バイナリ・データ型

- `BLOB` - 非構造化バイナリ・データを4GBまで格納できます。

- `BFILE` - 外部ファイルに格納されるバイナリ・データを4GBまで格納できます。

  注意:

  `LONG`データ型および`LONG` `RAW`データ型は、下位互換性のためOracle9iで使用可能になっていますが、新しいアプリケーションでは使用しないでください。

## Oracle Data Provider for .NET LOBオブジェクト

ODP.NETでは、LOBデータを操作するために、`OracleBFile`、`OracleBlob`および`OracleClob`の3つのLOB用オブジェクトが提供されます。

表3-19は、特定のOracle LOBタイプに使用するのに適したODP.NETオブジェクトを示しています。

表3-19 ODP.NET LOBオブジェクト

Oracle LOB型 | ODP.NET LOBオブジェクト
--- | ---
`BFILE` | `OracleBFile`
`BLOB` | `OracleBlob`
`CLOB` | `OracleClob`
`NCLOB` | `OracleClob`

ODP.NET LOBオブジェクトは、`OracleDataReader`で適切な型指定アクセッサをコールするか、適切なバインド・タイプのコマンド実行で、出力パラメータとして取得できます。

ODP.NET LOBオブジェクトはすべて、汎用的な`Stream`操作を実行するために.NET `Stream`クラスから継承されます。LOBデータ(`BFILE`タイプを除く)は、`Write`などのメソッドを使用することで、ODP.NET LOBオブジェクトを使用して更新できます。読取りおよび書込み操作が実行されている場合、LOBオブジェクトのデータはキャッシュされません。このため、ReadまたはWriteの各要求は、データベース・ラウンドトリップを発生させます。`OracleClob`オブジェクトは`Read`メソッドをオーバーロードして、`CLOB`からデータを読み取る2つの方法を提供します。`byte[]`をバッファとして取得する`Read`メソッドは、Unicodeバイト配列として`CLOB`データを移入します。`char[]`をバッファとして取得する`Read`メソッドは、Unicode文字を移入します。

`OracleBFile`オブジェクトには拡張機能もあります。`OracleBFile`オブジェクトは、データが読み込まれる前に、`OpenFile`メソッドを使用して明示的にオープンする必要があります。以前にオープンした`BFILE`をクローズするには、`CloseFile`メソッドを使用します。

ODP.NET LOBオブジェクトはすべて接続済のオブジェクトで、存続中は接続している必要があります。LOBオブジェクトに関連付けられた接続がクローズすると、LOBオブジェクトは使用できなくなり、処理が必要になります。

ODP.NET LOBオブジェクトが型指定アクセッサによって`OracleDataReader`オブジェクトから取得される場合、`Connection`プロパティは、`OracleDataReader`オブジェクトで使用される同じ`OracleConnection`オブジェクトへの参照を使用して設定されます。LOBオブジェクトが出力パラメータとして取得される場合、`Connection`プロパティは、`OracleCommand`オブジェクトで使用される同じ`OracleConnection`プロパティへの参照を使用して設定されます。一時LOBを作成するためにODP.NET LOBオブジェクト・コンストラクタを起動させることで、LOBオブジェクトが取得される場合、`Connection`プロパティは、コンストラクタで指定された`OracleConnection`オブジェクトへの参照を使用して設定されます。

ODP.NET LOBオブジェクトの`Connection`プロパティは読取り専用であり、存続中は変更できません。また、ODP.NET LOBタイプ・オブジェクトは、ODP.NET LOBオブジェクトで参照される同じ`OracleConnection`のコンテキスト内でのみ使用できます。たとえば、ODP.NET LOBの`Connection`プロパティは、ODP.NET LOBオブジェクトが`OracleCommand`のパラメータである場合、`OracleCommand`オブジェクトと同じ接続を参照する必要があります。それ以外の場合、ODP.NETはコマンドの実行時に例外を発生させます。

関連項目:

Oracle Database 10g LOBの詳細とその使用方法は、Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイドを参照

## DataSetを使用したLOBの更新

`BFILE`データおよび`BLOB`データは、`byte`配列として`DataSet`に格納され、`CLOB`データおよび`NCLOB`データは、`string`として格納されます。他のタイプも同様に、`OracleDataAdapter`オブジェクトを使用して、SQLの自動生成に`OracleCommandBuilder`を使用することで、LOBデータの変更を入力および更新できます。

Oracle LOB列には、最大4GBのデータを格納できます。LOBデータが`DataSet`にフェッチされると、`DataSet`がLOB列に保持できるLOBデータの実際の量は、.NET文字列タイプの最大サイズ(2GB)に制限されます。このため、2GBより大きいLOBデータをフェッチする場合、ODP.NET LOBオブジェクトを使用してデータの損失を防ぐ必要があります。

## OracleCommandおよびOracleParameterを使用したLOBの更新

LOB列を更新するには、LOBデータをSQL文、無名PL/SQLブロックまたはストアド・プロシージャのパラメータとしてバインドします。パラメータ値は、NET Frameworkタイプ、ODP.NETタイプまたはODP.NET LOBオブジェクト・タイプとして設定できます。たとえば、.NET文字列データをOracle9i以降のデータベースのLOB列に挿入する場合、そのパラメータを`OracleDbType.Varchar2`としてバインドできます。値が`OracleClob`オブジェクトに設定されているパラメータの場合、パラメータを`OracleDbType.Clob`としてバインドする必要があります。

## ODP.NET LOBオブジェクトを使用したLOBの更新

Oracle `BFILE`は更新できないため、`OracleBFile`オブジェクトで`BFILE`列を更新することはできません。

ODP.NET LOBオブジェクトを使用してLOBデータを更新するには、2つの要件を満たす必要があります。

1. LOB列を選択する前に、トランザクションを開始する必要があります。

   `OracleTransaction` `Commit`メソッドまたは`Rollback`メソッドが起動されたときにロックが解除されるように、コマンド実行の前に`OracleConnection`で`BeginTransaction`メソッドを使用してトランザクションを開始する必要があります。

2. 行ごとに、または結果セット全体の一部として、LOB列が存在する行をロックする必要があります。

   1. 結果セット全体のロック

      `SELECT`文の最後に`FOR` `UPDATE`句を追加します。コマンドの実行後、結果セット全体がロックされます。

   2. 行のロックには、2つのオプションがあります。

      - `OracleDataReader`オブジェクトで`OracleDataReader`の型指定アクセッサの1つ(`GetOracleClobForUpdate`または`GetOracleBlobForUpdate`)を起動して、現在の行がロックされている間にODP.NET LOBオブジェクトを取得します。

        この方法では、結果セットに主キー、一意の列または`ROWID`が必要です。`OracleDataReader`オブジェクトは行を一意に識別して、ロック用に再選択するためです。

      - `RETURNING`句でLOBを戻す`INSERT`または`UPDATE`文を実行します。

## 一時LOB

一時LOBは、`BLOB`、`CLOB`および`NCLOB`オブジェクトに対してインスタンス化できます。一時LOBを表すODP.NET LOBオブジェクトをインスタンス化するには、`OracleClob`または`OracleBlob`コンストラクタを使用します。

一時ODP.NET LOBオブジェクトは、次の目的に使用できます。

- 空または空ではないLOBデータを使用して、LOB列を初期化および移入します。

- LOBタイプをSQL文、無名PL/SQLブロックまたはストアド・プロシージャへの入力パラメータとして渡します。

- `CopyTo`操作において、2つのLOBオブジェクト間のデータ送信のソースまたは宛先として機能します。

  注意:

  一時LOBはトランザクションを認識しません。コミット操作およびロールバック操作は、一時LOBで参照されるデータには影響しません。