ADOのバッチアップデートでのキャッシュアップデートもどきについて

解決


GABIN  2007-11-06 18:32:49  No: 28231

・環境
Delphi2007 for win32 pro
サーバーはSQL server 2005 express sp2

ADOによる接続での話なのですが、現在上記の環境でサーバーにADOで接続しています。
自分の手元にあるデータベースの参考書によるとQueryで更新したい場合はキャッシュアップデートを使うが、ADOはキャッシュアップデートをサポートしないとありました。
ちなみにこの参考書はdelphi5の時代のものなので今は違うかもしれませんが・・・。
(delphi自体は昔からやっていたので古い参考書は結構もっているのですがデータベースは最近始めたので・・・)

しかしADOでもキャッシュアップデートもどきは出来るとありました。
それを要約すると下記のような感じになります。

・TAdoQueryをバッチアップデートモードに設定する
・実際の更新時にUpdateBatchは使わずに下記のコードを使う

//↓実際の更新をするタイミングで下記を実行
procedure TForm1.Update;
begin
    AdoQuery.First;

    while not(AdoQuery.Eof) do
    begin
        case AdoQuery.UpdateStatus of
            usInserted : //実際の挿入処理
            usModified : //実際の更新処理
            usDeleted  : //実際の削除処理
        end;

        AdoQuery.Next;
    end;

    AdoQuery.Close;
    AdoQuery.Open;
end;

要するにバッチアップデートのキャッシュだけを利用して実際の更新処理をし、それが終わったらAdoQueryを開き直してキャッシュをリセットするという事みたいです。
これで挿入と更新はうまくいくのですが削除が出来なくて困っています。
原因を調べてみるとどうも削除されたレコードのUpdateStatusにusDeletedがセットされないために実際の削除処理が呼び出されないようなのです。

しかし削除をするとDBGrid上ではその行は消えるので削除自体はキャッシュに記録されているはずです。
と、いうことはUpdateStatusにusDeletedがセットされると思うのですが・・・
どなたか原因が分かる方いらっしゃいませんか?


GABIN  2007-11-07 18:32:31  No: 28232

自己レスです。

いろいろ試した結果、TAdoQueryでキャッシュアップデートもどきをするより
TClientDataSetをTDataSetProvider経由でTAdoQueryと接続し、TClientDataSetで
ローカルにキャッシュを作ってTDataSetProviderのBeforeUpdateRecordイベントで
実際の処理をさせるほうがよさそうだという結論に至りました。
こちらなら削除のフラグも立ちますので。

手元の参考書にはTClientDataSetの記述がないのでこの時代にはTClientDataSetが
無かったのかな?
とりあえずうまくいきそうなので解決とします。お邪魔しました。

あとTAdoQueryのUpdateStatusにusDeletedがセットされなかった理由は結局わからず
じまいです(汗


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加