3.21 データベースへの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
プロパティの構成によって更新中に一意性を維持する方法が説明されます。
この項の内容は次のとおりです。
3.21.1 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
値を持つ複数の行が存在する可能性があるためです。これは、各行に列セットの値の一意のセットがあるという一意性条件に違反します。
3.21.2 PrimaryKeyおよびConstraintsプロパティの構成
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
オブジェクト(あるいはその両方)の一部である場合、選択リストに列が出現するたびにこれが繰り返されます。
3.21.3 PrimaryKeyおよびConstraintsが構成されていない場合の更新
アプリケーションがOracleDataAdapter.FillSchema
メソッドをコールしていない場合など、DataTable.PrimaryKey
またはConstraints
プロパティが構成されていない場合、OracleCommandBuilder
オブジェクトはOracleDataAdapter.SelectCommand
プロパティの選択リストを直接チェックして、DataTable
の一意性が保証されているかどうかを確認します。ただし、このチェックによりデータベース・ラウンドトリップが1回行われ、OracleDataAdapter.SelectCommand
のSELECT
文のメタデータが取得されます。
PL/SQL文はメタデータのキー情報を戻さないため、OracleCommandBuilder
オブジェクトはPL/SQL文から作成されたDataTable
を更新できません。