この項では、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オブジェクトの一意性を保証するために満たす必要がある最低条件について説明します。一意性の条件は、次の項で説明するように、DataTable.PrimaryKeyおよびDataTable.Constraintsプロパティが構成される前に保証される必要があります。
DataTableオブジェクトの一意性は、次のいずれかに当てはまる場合に保証されます。
主キーの列はすべて、OracleDataAdapter.SelectCommandプロパティの選択リスト内にあります。
一意制約の列はすべて、OracleDataAdapter.SelectCommandプロパティの選択リスト内にあり、含まれる少なくとも1つの列にNOT NULL制約が定義されています。
一意索引の列はすべて、OracleDataAdapter.SelectCommandプロパティの選択リスト内にあり、含まれる少なくとも1つの列にNOT NULL制約が定義されています。
ROWIDは、OracleDataAdapter.SelectCommandプロパティの選択リスト内に存在します。
|
注意: 一意制約が定義されたか、または一意索引が作成された列のセットには、少なくとも1つのNULL値不可の列が必要です。その理由は、列セットのすべての列がNULL値可能な場合、列セットの列ごとにNULL値を持つ複数の行が存在する可能性があるためです。これは、各行に列セットの値の一意のセットがあるという一意性条件に違反します。 |
「DataRowオブジェクトの一意性を構成する要素」で説明した最小条件が満たされる場合、DataTable.PrimaryKeyまたはDataTable.Constraintsプロパティを設定できます。
これらのプロパティを設定した後に、OracleCommandBuilderオブジェクトは、DataTable.PrimaryKeyプロパティまたはDataTable.ConstraintsコレクションのUniqueConstraintオブジェクトの存在をチェックすることで、DataTableの一意性を確認できます。一意性が確認されると、OracleCommandBuilderオブジェクトはDML文を安全に生成してデータベースを更新できます。
OracleDataAdapter.FillSchemaメソッドは、次の優先順位に従ってこれらのプロパティを設定しようとします。
選択リスト内で主キーが戻される場合、DataTable.PrimaryKeyプロパティとして設定されます。
次の基準を満たす列のセットが選択リスト内で戻される場合、DataTable.PrimaryKeyプロパティとして設定されます。
基準:列のセットには、定義された一意制約または作成された一意索引があり、各列にNOT NULL制約が定義されています。
次の基準を満たす列のセットが選択リストで戻される場合、DataTable.ConstraintsコレクションにUniqueConstraintオブジェクトが追加されますが、DataTable.PrimaryKeyプロパティは設定されません。
基準:列のセットには、定義された一意制約または作成された一意索引があり、少なくとも1つの列にNOT NULL制約が定義されています。
ROWIDが選択リストの一部の場合、DataTable.PrimaryKeyプロパティとして設定されます。
また、OracleDataAdapter.FillSchemaメソッドは次の動作を示します。
DataTable.PrimaryKeyプロパティを暗黙的に設定すると、UniqueConstraintオブジェクトが作成されます。
列がDataTable.PrimaryKeyプロパティまたはUniqueConstraintオブジェクト(あるいはその両方)の一部である場合、選択リストに列が出現するたびにこれが繰り返されます。
アプリケーションがOracleDataAdapter.FillSchemaメソッドをコールしていない場合など、DataTable.PrimaryKeyまたはConstraintsプロパティが構成されていない場合、OracleCommandBuilderオブジェクトはOracleDataAdapter.SelectCommandプロパティの選択リストを直接チェックして、DataTableの一意性が保証されているかどうかを確認します。ただし、このチェックによりデータベース・ラウンドトリップが1回行われ、OracleDataAdapter.SelectCommandのSELECT文のメタデータが取得されます。
PL/SQL文はメタデータのキー情報を戻さないため、OracleCommandBuilderオブジェクトはPL/SQL文から作成されたDataTableを更新できません。