无法检查数据集中已更改的行

时间:2017-07-05 00:29:08

标签: c# sql sql-server database oledb

我的程序中有一个表,用于存储有关消息的信息,并希望检测何时添加了新信息。我之所以这样做是因为我希望只有在有新数据时才向用户显示新数据,而不是经常获取所有行并显示它们。

我决定这样做的方法是使用dataSet.HasChanged()函数,它应该基本上检查数据集中的任何新行,而一个名为DataChanged的函数返回dataSet.HasChanged()值。

但是,我使用的函数总是返回false(即使有更改)

这是函数......

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 :(得分:0)

这是一种简单的方法。

确保您希望跟踪更改的每个表都存在时间戳/行转换列。

将当前数据库Timestamp作为数据结果集的一部分(在本例中为DataSet)返回给调用程序。例如,将以下查询添加到结果集中。

SELECT @@DBTS;

下次运行查询时使用此返回值,并根据需要将以下内容添加到现有WHERE子句中。

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

第一次运行查询时,为@LastRowversionValue传递NULL以启动进程。

自上次检索数据以来插入/更新到表中的任何行的Rowversion都将大于上次执行时存储的行。