レコードのリフレッシュ
クライアント データセットが扱うデータは、ソース データセットから取得したデータのメモリ内スナップショットです。ソース データセットがサーバー データである場合、そのうちに他のユーザーがそのデータを変更することがあります。そうすると、クライアント データセット内のデータは、ソース データセットのデータを正確に反映したものではなくなります。
他のデータセットと同様に、クライアント データセットにも Refresh メソッドがあり、サーバー上の現在の値に合わせてレコードを更新することができます。ただし、Refresh を呼び出しても問題がないのは、変更ログに編集が含まれていない場合だけです。まだ適用されていない編集があるときに Refresh を呼び出すと、例外が発生します。
クライアント データセットでは、変更ログをそのまま残してデータを更新することもできます。その場合は、RefreshRecord メソッドを呼び出します。Refresh メソッドとは違って、RefreshRecord はクライアント データセット内の現在のレコードだけを更新します。RefreshRecord は、レコードのうち、プロバイダから取得したままになっている値は変更しますが、変更ログに含まれる変更はそのまま残します。
警告: RefreshRecord を呼び出すのが常に適切であるとは限りません。ユーザーの編集と、別のユーザーが元のデータセットに対して行った編集とが競合する場合、RefreshRecord を呼び出すとその競合が隠されてしまいます。クライアント データセットが更新を適用しても、調停エラーは発生せず、アプリケーションで競合を解決することができません。
更新エラーが隠れてしまわないよう、RefreshRecord を呼び出す前に、未処理の更新がないことを確認することができます。たとえば次の AfterScroll では、ユーザーが次のレコードに移動すると現在のレコードを更新して最新の値にしていますが、それを行うのは、そうしても安全な場合だけです。
procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet); begin if ClientDataSet1.UpdateStatus = usUnModified then ClientDataSet1.RefreshRecord; end;
void __fastcall TForm1::ClientDataSet1AfterScroll(TDataSet *DataSet) { if (ClientDataSet1->UpdateStatus == usUnModified) ClientDataSet1->RefreshRecord(); }