2009-05-11 8 views
9

私が働いているプロジェクトには以下のようなコードがあります。個人的にTDatasetブックマークはどのくらい有効ですか?

procedure TForm.EditBtnClick(Sender:TObject); 
begin 
    // Mark is form variable. It's private 
    Mark = cdsMain.GetBookmark; 
    // blabalbal 
    . 
    . 
    . 
end; 

procedure TForm.OkBtnClick(Sender:TObject); 
var 
    mistakes: Integer; 
begin 
    //Validation stuff and transaction control 
    //removed to not clutter the code 
    If cdsMain.ChangeCount <> 0 then 
    mistakes := cdsMain.AppyUpdates(-1); 
    cdsMain.Refresh; 
    try 
    cdsMain.GotoBookmark(Mark); 
    // Yes, I know I would have to call FreeBookmark 
    // but I'm just reproducing 
    except 
    cdsMain.First; 
    end; 
end; 

、私は多くのブックマークを使用していない - 私は唯一のカーソル位置を移動したデータセットを再配置することを除いて(リストを作成するには、文字列リストを埋める、など)。 I Refresh、更新(特にフィルタでレコードを非表示にできる場合)、再取得(Close/Open)、またはデータセット内のデータを変更する操作はブックマークを使用しません。私はLocateをプライマリキー(もちろんTClientDatasetを使用しています)またはパラメータを変更することをお勧めします。

ブックマークはいつ有効ですか? Refreshまで? Close/Openまでデータを再取得するまでですか?セーフゾーンはどこで終了するのですか?

私はTClientDatasetTSQLQuery(DbExpress)を使用しています。

答えて

5

c0rwinskamradtの両方に同じように:ブックマークの動作は、使用するTDataSetの子孫によって異なります。

私が知っている

  • データの変更(時にはのみ削除)(それをサポートするデータセット上)

    1. オープン/クローズ
    2. リフレッシュ:一般的に

      は、ブックマークが中に無効になりますTClientDataSetsでブックマークを無効にすることができます。 TClientDataSetsの場合、どの基本プロバイダ(TSQLQuery、TIBQueryなど)が使用されているかは関係ありません。

      動作するものと動作しないものを確認する唯一の方法です。 あなたがそれらを使用していないことはまったく正しいことを意味します。ブックマークは信頼できない本質的なチャンスを持っています。

      ブックマークに行く前に、常に安全な状態にするには、BookmarkValidを必ず呼び出してください。

  • +5

    いくつかの実験の後、BookmarkValidさえそれ自体が信頼できないことが証明されます。これは、データセットでフィルタを有効にしたときに発生します。レコードがフィルタ条件と一致しなくてもtrueを返します。最終的には例外がスローされます。 –

    1

    TDataSetは仮想ブックマークメソッドを実装しています。これらのメソッドは、ブックマークメソッドが呼び出された場合にTDataSetから派生したデータセットオブジェクトが値を返すことを保証しますが、戻り値は現在の場所を追跡しないデフォルト値に過ぎません。例えばTBDEDataSetとしてTDataSetのの子孫は、以下のリストに記載されているように意味のある値を返すためにブックマークメソッドを再実装:

    • は、指定されたブックマークが使用中であるかどうかを決定するため、をBookmarkValid。
    • 比較ブックマーク、2つのブックマークをテストして同じかどうかを確認します。
    • GetBookmark、データセットの現在の位置にブックマークを割り当てる。
    • GotoBookmarkは、以前GetBookmarkによって割り当てられたブックマークを解放するために、以前にGetBookmark
    • FreeBookmarkが作成したブックマークに戻ります。

    私はめったにブックマークを使用個人的にhere

    +0

    ありがとうございます。私はその質問を言い換えるつもりです。 –

    +0

    残念ながら、私はDelphiを少し前からプログラミングしていたので、この質問に対する答えは覚えていません。私の直感は、DataSetが公開されるまで有効であるはずだが、オープン/クローズした後でも役に立つ実装を考えることができる。私はまた、ベンダーに依存している可能性があるので、怒りの答えに同意する傾向があります。 –

    4

    からそれを取得します。代わりに、私が見ているレコードのIDを使用し、更新が完了したらそのレコードの位置を実行します。セット内のすべてのレコードを繰り返し処理する必要がある場合は、tClientDatasetのクローン(独自のカーソルを取得)を使用して行います。

    ブックマークの実装は、tDataset子孫のベンダーに任されており、実装によって異なる場合があります。私の非常に単純なデータセット(tBinData)では、物理レコード番号としてブックマークを実装しています。そのため、レコードが削除されない限り、リフレッシュ間に持続します。すべての実装でこれを真実に話すことはできません。

    関連する問題