サーバーからの制約を処理する
データベースサーバーで,どのようなデータが有効かについて制約を定義しているとき,クライアントデータセットでそのことについて認識している場合に使用できます。このようにして,クライアントデータセットにより,ユーザーの編集で絶対にサーバー制約の違反が生じないことを保証できます。そのため,このような違反は,拒絶される場合に,データベースサーバーに決して渡されることはありません。このことは,わずかな更新でも更新プロセス中にエラー条件が発生することを意味します。
データのソースに関係なく,明示的にクライアントデータセットに追加することにより,このようなサーバー制約を複製できます。この手順の詳細は,「データ値を制限する」で説明しています。
ただし,サーバー制約が自動的にデータパケットに含まれれば,さらに便利です。その後,デフォルトの式と制約を明示的に指定する必要がなくなりますが,クライアントデータセットでは,サーバー制約が変わったときにその値を変更し有効になるようにします。これがデフォルトです。ソースデータセットでサーバー制約を認識できる場合,サーバー制約はプロバイダによって自動的にデータパケットに入れられ,ユーザーが編集結果を変更ログに登録したときにクライアントデータセットにより有効になります。
メモ: BDE を使用するデータセットだけが,サーバーから制約をインポートできます。つまり,サーバー制約は,TBDEClientDataSet または TClientDataSet を BDE ベースのデータセットを表すプロバイダとともに使用したときに限り,データパケットに入るということです。サーバー制約をインポートする方法と,プロバイダがデータパケットにサーバー制約を入れるのを禁止する方法の詳細は,「サーバー制約の処理」を参照してください。
メモ: 制約がインポートされた後の制約の処理については,「サーバー制約の使い方」を参照してください。
サーバーの制約と式をインポートすると開発者がアプリケーションのデータ整合性を維持できるためたいへん便利ですが,一時的に制約を解除しなければならないことがあります。たとえば,サーバーの制約が項目の現在の最大値に基づいている場合,クライアントデータセットがインクリメンタルフェッチを使用すると,クライアント側の項目の現在の最大値はデータベースサーバーの最大値と相違して,制約の適用方法が異なってくることがあります。また,制約が有効な場合にクライアントデータセットがレコードにフィルタを適用すると,フィルタが制約条件と競合することがあります。どちらの場合も,アプリケーションで制約チェックを無効にできます。
制約を一時的に解除するには,DisableConstraints メソッドを呼び出します。DisableConstraints が呼び出されるたびに,参照カウントが増えていきます。参照カウントがゼロより大きければ,クライアントデータセットに対する制約は適用されません。
クライアントデータセットに対する制約を再度有効にするには,データセットのEnableConstraints メソッドを呼び出します。EnableConstraints を呼び出すたびに,参照カウントが減っていきます。参照カウントがゼロになると,制約が再度有効になります。
ヒント: DisableConstraints と EnableConstraints は必ずペアにして呼び出し,必要に応じて制約を適用できるようにします。