2017-07-05 2 views
0

私のプログラム内にメッセージに関する情報を格納し、新しい情報が追加されたときに検出したいテーブルがあります。私がこれをやっている理由は、新しいデータが常に存在している場合にのみ新しいデータを表示して、常にすべての行を取得して表示したいからです。データセット内の変更された行を確認できません

これを行う方法は、dataSet.HasChanged()関数を使用することでした。これは基本的に新しい行のデータセットをチェックし、DataChangedという関数はdataSet.HasChanged()の値を返します。しかし、私はいつも使用している機能は、ここで

(変更がある場合でも)偽を返す

が関数である...何らかの理由で

public bool DataChanged(string Table) 
{ 
    //This is the variable that will be returned 
    bool ChangesMade; 

    //Create the adapter 
    OleDbDataAdapter adapter = new OleDbDataAdapter(Table, connector); 
    //Clear the current data in the dataset 
    dataSet.Clear(); 
    //Open the connection and fill the dataset 
    connector.Open(); 
    adapter.Fill(dataSet, "TableData1"); 
    connector.Close(); 
    return ChangesMade = dataSet.HasChanges(); 
} 

変更が検出されないため、この機能んデータセットに新しいレコードを追加しても常にfalseを返します。

第1項で説明した機能を提供する別の方法は、私の現在の方法の修正が非常に役に立ちます。

答えて

0

これは簡単な方法です。

変更を追跡するテーブルごとにタイムスタンプ/ローバージョン列が存在することを確認してください。

データ結果セット(この場合はDataSet)の一部として、呼び出し元のプログラムに現在のデータベースのタイムスタンプを返します。たとえば、次のクエリを結果セットに追加します。

SELECT @@DBTS; 

これを使用して、次の必要に応じて既存のWHERE句(複数可)に追加して、あなたのクエリを実行する次の時間値を返しました。

... 
AND (@LastRowversionValue IS NULL 
    OR TableName.RowversionColumn > @LastRowversionValue) 
... 

@LastRowversionValueには、プロセスを開始するためにクエリが実行されたときにNULLを渡します。

最後にデータを取得してからテーブルに挿入/更新される行は、最後に実行したときに格納したRowversionより大きい値になります。

関連する問題