0

ADO Dataset基礎となるテーブルが更新されたかどうか、またはいつ更新されたかを「知る」ことは可能ですか?

現時点では、フォルダー内のそのアイテムのファイルを受信するたびに、アイテムのステータスを確認する必要があります。これにより、一度に最大 1300 のイベントを取得するため、大量の SQL クエリが発生します。

ADO Datasetステータスを保持するアプリケーションにを追加して、ステータスLocateを確認するために使用することを考えています。

datasetタイマーなどで定期的に更新する代わりに、基になるテーブル レコードが変更されたらすぐに更新したいと考えています。

ありがとう。

4

2 に答える 2

1

ADOデータセットは、クライアント/サーバーの概念に基づいてクライアントにデータを取得します。Webブラウザのように。

つまり、[クライアント要求]-> [サーバー]、[サーバー応答]->[クライアント]です。したがって、クライアントは実際にデータが変更されたかどうかを知ることができません。

最も簡単な方法は、データを再クエリ(閉じる/開く)して、必要に応じてデータをフェッチすることです。一度にすべての1300を取得するわけではありません。これは最もよく使われる解決策です。

とにかく、データの量が本当に大きく、最適化を試してみたい場合は、次の2つの方法があります。

A.トリガーを使用して、ログテーブルを作成し、テーブルデータの変更を登録します。定期的にサーバーに変更を依頼します(これはバックグラウンドスレッドで行うことができます)。

select L.RECORD_ID, L.OPERATION_ID
from FILE_LOG L
where L.FDATESTAMP between :LAST_WATCH and :CURRENT_STAMP and L.FOLDER_ID = :FOLDER_ID

RECORD_IDとOPERATION_ID(つまり、挿入/更新/削除)を取得します。

B. DBMSにリンクされていない場合、Firebird /Interbaseにはイベントの概念があります。トリガーを使用すると、データが変更されたことをクライアントに通知でき、変更されたデータだけを再クエリできます。

于 2012-07-13T11:57:20.607 に答える
0

私たちが知る限り、SQL Server でテーブルに変更が加えられたかどうかを検出する唯一の方法は、動的管理ビュー sys.dm_db_index_usage_stats ( http://msdn.microsoft.com/en ) を使用することです。 -us/library/ms188755.aspx )。

私の目的のために、情報へのアクセスを容易にする関数を作成しました。

create function [dbo].[_efnLastTableUpdateTime](@TableName varchar(255))
/*  Function to return the last datetime that a table was modified.
    Note that because this is from a dynamic management view, it is only
    since the server was started, i.e. will return null if no change since
    the server was started.
    SQL2005 or later.
*/
returns datetime
as
begin
    declare @Result datetime
    set @Result = (
            select top 1 [last_user_update]
            from sys.dm_db_index_usage_stats
            where object_id=object_id(@TableName)
            order by [last_user_update] desc
        )
    return @Result
end
GO

次に、TADOQuery の子孫に、TADOQuery にアクセスする関数と、機能のオンとオフを切り替えるプロパティを組み込みました。その後、これをオンデマンドで呼び出すことができるため、非常に効率的な応答が得られます。

function TMyADOQuery.HasBeenUpdatedSinceOpen(const ACloseIfHasBeen: boolean = false): boolean;
const
  sSelectTableUpdateTime = 'select [dbo]._efnLastTableUpdateTime(''%s'')';
var
  NewUpdateTime: TDateTime;
begin
  Result := false;
  if(_TrackUpdated) and (Active) and (_TableName > '') then begin
    NewUpdateTime := TrackUpdateQuery.SelectScalarDate(Format(sSelectTableUpdateTime, [_TableName]), 0);
    Result := (FLastUpdateTime <> NewUpdateTime);
    FLastUpdateTime := NewUpdateTime;
  end;
  if(Result) and (ACloseIfHasBeen) then
    Close;
end;

TrackUpdateQuery内部で作成された TADOQuery の別のインスタンスでありSelectScalarDate、私の TADOQuery クラスの拡張です。

ユーザーが管理ビューにアクセスできるようにするには、 VIEW SERVER STATE権限が付与されている必要があることに注意してください。

于 2012-07-13T11:56:36.763 に答える