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

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

前 | 次 |

# データベースへのDataSetの更新における一意性の保証

この項では、`OracleCommandBuilder`オブジェクトが`DataSet`の変更をデータベースに更新するときに、一意性を保証する`DataTable`オブジェクトの`PrimaryKey`および`Constraints`プロパティが`OracleDataAdapter`によって構成される方法について説明します。

`OracleCommandBuilder`オブジェクトを使用して、データベースに対して実行されるDML文を動的に生成するのは、1つの`DataTable`オブジェクトにおける変更をデータベースと一致させる方法の1つです。

このプロセスでは、`OracleCommandBuilder`オブジェクトは、1つの`DataRow`の変更を一致させるときに、データベース内の1行に影響する(更新または削除)DML文を生成することはできません。それ以外の場合、`OracleCommandBuilder`によりデータベース内のデータが破損する可能性があります。

各`DataRow`オブジェクトの変更が1行にのみ影響を与えるようにするには、`DataTable`内のすべての行が一意の値のセットを持つ`DataTable`の`DataColumn`オブジェクトのセットが必要です。プロパティ`DataTable.PrimaryKey`および`DataTable.Constraints`によって示される`DataColumn`オブジェクトのセットは、この要件を満たします。`OracleCommandBuilder`オブジェクトは、`DataTable.PrimaryKey`がNULL以外か、または`DataTable.Constraints`コレクションに`UniqueConstraint`オブジェクトが存在するかどうかをチェックすることで、`DataTable`の一意性を確認します。

これにより、`DataRow`オブジェクトの一意性を構成する要素と、`DataTable`プロパティの構成によって更新中に一意性を維持する方法が説明されます。

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

- DataRowオブジェクトの一意性を構成する要素

- PrimaryKeyおよびConstraintsプロパティの構成

- PrimaryKeyおよびConstraintsが構成されていない場合の更新

## DataRowオブジェクトの一意性を構成する要素

この項では、`DataRow`オブジェクトの一意性を保証するために満たす必要がある最低条件について説明します。一意性の条件は、次の項で説明するように、`DataTable.PrimaryKey`および`DataTable.Constraints`プロパティが構成される前に保証される必要があります。

`DataTable`オブジェクトの一意性は、次のいずれかに当てはまる場合に保証されます。

- 主キーの列はすべて、`OracleDataAdapter.SelectCommand`プロパティの選択リスト内にあります。

- 一意制約の列はすべて、`OracleDataAdapter.SelectCommand`プロパティの選択リスト内にあり、含まれる少なくとも1つの列に`NOT` `NULL`制約が定義されています。

- 一意索引の列はすべて、`OracleDataAdapter.SelectCommand`プロパティの選択リスト内にあり、含まれる少なくとも1つの列に`NOT` `NULL`制約が定義されています。

- `ROWID`は、`OracleDataAdapter.SelectCommand`プロパティの選択リスト内に存在します。

注意:

一意制約が定義されたか、または一意索引が作成された列のセットには、少なくとも1つのNULL値不可の列が必要です。その理由は、列セットのすべての列がNULL値可能な場合、列セットの列ごとに`NULL`値を持つ複数の行が存在する可能性があるためです。これは、各行に列セットの値の一意のセットがあるという一意性条件に違反します。

## PrimaryKeyおよびConstraintsプロパティの構成

DataRowオブジェクトの一意性を構成する要素で説明した最小条件が満たされる場合、`DataTable.PrimaryKey`または`DataTable.Constraints`プロパティを設定できます。

これらのプロパティを設定した後に、`OracleCommandBuilder`オブジェクトは、`DataTable.PrimaryKey`プロパティまたは`DataTable.Constraints`コレクションの`UniqueConstraint`オブジェクトの存在をチェックすることで、`DataTable`の一意性を確認できます。一意性が確認されると、`OracleCommandBuilder`オブジェクトはDML文を安全に生成してデータベースを更新できます。

`OracleDataAdapter.FillSchema`メソッドは、次の優先順位に従ってこれらのプロパティを設定しようとします。

1. 選択リスト内で主キーが戻される場合、`DataTable.PrimaryKey`プロパティとして設定されます。

2. 次の基準を満たす列のセットが選択リスト内で戻される場合、`DataTable.PrimaryKey`プロパティとして設定されます。

   基準:列のセットには、定義された一意制約または作成された一意索引があり、各列に`NOT` `NULL`制約が定義されています。

3. 次の基準を満たす列のセットが選択リストで戻される場合、`DataTable.Constraints`コレクションに`UniqueConstraint`オブジェクトが追加されますが、`DataTable.PrimaryKey`プロパティは設定されません。

   基準:列のセットには、定義された一意制約または作成された一意索引があり、少なくとも1つの列に`NOT` `NULL`制約が定義されています。

4. `ROWID`が選択リストの一部の場合、`DataTable.PrimaryKey`プロパティとして設定されます。

また、`OracleDataAdapter.FillSchema`メソッドは次の動作を示します。

- `DataTable.PrimaryKey`プロパティを暗黙的に設定すると、`UniqueConstraint`オブジェクトが作成されます。

- 列が`DataTable.PrimaryKey`プロパティまたは`UniqueConstraint`オブジェクト(あるいはその両方)の一部である場合、選択リストに列が出現するたびにこれが繰り返されます。

## PrimaryKeyおよびConstraintsが構成されていない場合の更新

アプリケーションが`OracleDataAdapter.FillSchema`メソッドをコールしていない場合など、`DataTable.PrimaryKey`または`Constraints`プロパティが構成されていない場合、`OracleCommandBuilder`オブジェクトは`OracleDataAdapter.SelectCommand`プロパティの選択リストを直接チェックして、`DataTable`の一意性が保証されているかどうかを確認します。ただし、このチェックによりデータベース・ラウンドトリップが1回行われ、`OracleDataAdapter.SelectCommand`の`SELECT`文のメタデータが取得されます。

PL/SQL文はメタデータのキー情報を戻さないため、`OracleCommandBuilder`オブジェクトはPL/SQL文から作成された`DataTable`を更新できません。