次の方法で共有


テーブルへの制約の追加

Constraints を使用すると、データの整合性を維持するために DataTable のデータを強制的に制限できます。制約は、1 つの列または関連付けられた複数の列に対して自動的に適用される規則であり、行の値がなんらかの方法で変更されたときに実行されるアクションを決定します。Constraints は、DataSetEnforceConstraints プロパティを true に設定したときに適用されます。

ADO.NET には、ForeignKeyConstraintUniqueConstraint の 2 種類の制約があります。既定では、DataRelationDataSet に追加して複数のテーブル間のリレーションシップを作成すると、この 2 種類の制約が両方とも自動的に作成されます。ただし、リレーションシップの作成時に createConstraints = false と指定することにより、この動作を無効にできます。

ForeignKeyConstraint

ForeignKeyConstraint は、関連付けられているテーブルに更新や削除を反映させる方法についての規則を適用します。たとえば、あるテーブルの行の値が更新または削除され、その同じ値が、関連付けられている別のテーブルでも使用されている場合、関連付けられているテーブル内で実行されるアクションは ForeignKeyConstraint によって決定されます。

ForeignKeyConstraintDeleteRule プロパティおよび UpdateRule プロパティは、ユーザーが関連付けられているテーブルの行を削除または更新しようとしたときに実行されるアクションを定義します。ForeignKeyConstraintDeleteRule プロパティおよび UpdateRule プロパティに使用できるさまざまな設定の説明を次の表に示します。

規則 説明
Cascade 関連付けられている行を削除または更新します。これは、既定の設定です。
SetNull 関連付けられている行の値を DBNull に設定します。
SetDefault 関連付けられている行の値を既定値に設定します。
None 関連付けられている行に対してアクションを実行しないことを指定します。

ForeignKeyConstraint は、関連付けられている行への変更を制限したり、反映させたりできます。列の ForeignKeyConstraint に対して設定されたプロパティによっては、DataSetEnforceConstraints プロパティが true である場合に親の行に対して操作を実行すると、例外が発生することがあります。たとえば、ForeignKeyConstraintDeleteRule プロパティが None の場合、子の行を持っている親の行は削除できません。

ForeignKeyConstraint コンストラクタを使用すると、単一列間または列配列間の外部キー制約を作成できます。ConstraintCollection の 1 つである、テーブルの Constraints プロパティの Add メソッドに結果の ForeignKeyConstraint オブジェクトを渡します。コンストラクタ引数を ConstraintCollectionAdd メソッドのいくつかのオーバーロードに渡すことにより、ForeignKeyConstraint を作成することもできます。

ForeignKeyConstraint を作成するときに、DeleteRule の値と UpdateRule の値を引数としてコンストラクタに渡したり、それらの値を次の例に示すようにプロパティとして設定したりできます。この例では、UpdateRule の値が既定値の Cascade に設定されています。

Dim custOrderFK As ForeignKeyConstraint = New ForeignKeyConstraint("CustOrderFK", _
                                            custDS.Tables("CustTable").Columns("CustomerID"), _
                                            custDS.Tables("OrdersTable").Columns("CustomerID"))
custOrderFK.DeleteRule = Rule.None  
' Cannot delete a customer value that has associated existing orders.
custDS.Tables("OrdersTable").Constraints.Add(custOrderFK)
[C#]
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
                                     custDS.Tables["CustTable"].Columns["CustomerID"], 
                                     custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;  
// Cannot delete a customer value that has associated existing orders.
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);

AcceptRejectRule

行への変更は、AcceptChanges メソッドを使用して受け入れることができ、DataSetDataTable、または DataRowRejectChanges メソッドを使用してキャンセルできます。DataSetForeignKeyConstraints が含まれている場合は、AcceptChanges メソッドまたは RejectChanges メソッドを呼び出すと、AcceptRejectRule が強制適用されます。ForeignKeyConstraintAcceptRejectRule プロパティは、親の行に対して AcceptChanges または RejectChanges が呼び出されたときに、子の行に対して実行されるアクションを決定します。

AcceptRejectRule に設定できる値を次の表に示します。

アクション 説明
Cascade 子の行への変更を受け入れるかまたは拒否します。
None 子の行に対してアクションを実行しないことを指定します。これは、既定の設定です。

UniqueConstraint

UniqueConstraint オブジェクトは、DataTable 内の 1 つの列または列の配列に対して割り当てることができ、指定された列内のすべてのデータが行ごとに一意になるようにします。UniqueConstraint コンストラクタを使用して、1 つの列または列の配列に対する UNIQUE 制約を作成できます。ConstraintCollection の 1 つである、テーブルの Constraints プロパティの Add メソッドに結果の UniqueConstraint オブジェクトを渡します。コンストラクタ引数を ConstraintCollectionAdd メソッドのいくつかのオーバーロードに渡すことにより、UniqueConstraint を作成することもできます。1 つの列または複数の列に対して UniqueConstraint を作成するときは、オプションで、その列または複数の列を主キーにするかどうかを指定できます。

列の Unique プロパティを true に設定することにより、1 つの列に対する UNIQUE 制約を作成することもできます。また、1 つの列の Unique プロパティを false に設定することにより、既存の UNIQUE 制約を削除できます。1 つの列 (または複数の列) をテーブルの主キーとして定義すると、指定した列 (または複数の列) の UNIQUE 制約が自動的に作成されます。DataTablePrimaryKey プロパティから列を削除すると、UniqueConstraint が削除されます。

DataTable の 2 つの列の UniqueConstraint を作成する例を次に示します。

Dim custTable As DataTable = custDS.Tables("Customers")
Dim custUC As UniqueConstraint = New UniqueConstraint(New DataColumn() _
                              {custTable.Columns("CustomerID"), _
                               custTable.Columns("CompanyName")})
custDS.Tables("Customers").Constraints.Add(custUC)
[C#]
DataTable custTable = custDS.Tables["Customers"];
UniqueConstraint custUC = new UniqueConstraint(new DataColumn[] 
                              {custTable.Columns["CustomerID"], 
                               custTable.Columns["CompanyName"]});
custDS.Tables["Customers"].Constraints.Add(custUC);

参照

DataSet の作成および使用 | DataRelation クラス | DataTable クラス | ForeignKeyConstraint クラス | UniqueConstraint クラス