如何从数据库中读取所有新行?

时间:2016-12-18 21:54:36

标签: c# oledbdatareader

我正在尝试读取计时器上添加到数据库的所有新行。

首先,我读取整个数据库并将其保存到本地数据表,但我想读取添加到数据库的所有新行。以下是我尝试阅读新行的方法:

string accessDB1 = string.Format("SELECT * FROM {0} ORDER BY ID DESC", tableName);
setupaccessDB(accessDB1);

int dTRows = localDataTable.Rows.Count + 1;
localDataTable.Rows.Add();

using (readNext = command.ExecuteReader())
{
    while (readNext.Read())
    {
        for (int xyz = 0; xyz < localDataTable.Columns.Count; xyz++)
        {
            // Code
        }
        break;
    }
}

如果在计时器中只添加了一行,那么这样可以正常工作,但是当添加多行时,这只会读取最新一行。

所以我可以通过任何方式阅读所有添加的行。

我正在使用OledbDataReader

提前致谢

3 个答案:

答案 0 :(得分:1)

你当前的问题在于:

while (readNext.Read())
{
    doSomething();
    break;
}

这就是你的循环基本归结为。在处理完第一个项目后,break将退出循环,无论有多少项目。

在这种情况下,第一项可能是添加的最后一项(正如您所说),因为您按降序ID进行排序。

在只读取新添加的行方面,有多种方法可以实现,有些方法取决于您正在使用的DBMS。

也许最简单和最便携的是添加一个额外的列processed,当第一次添加行时,该列设置为false。

这样,您可以只查找查找这些记录的查询,并为每个记录处理它们并将列设置为true。

事实上,您可以使用触发器来执行此操作(在插入时强制将标志设置为false),这样就可以使用更新来执行此操作。

跟踪删除有点困难,但仍然可以实现。你可以有一个触发器,在删除它之前实际将记录写入一个单独的表,这样你的处理代码也可以访问这些细节。

答案 1 :(得分:1)

对于大多数表,主键基于增量值。这可以是一个非常简单的整数,增加1,但它也可以是基于日期时间的guid。

无论如何,如果你知道最后一条记录的id。您可以简单地询问所有具有“更高”ID的记录。通过这种方式,您可以获得新记录,但更新的记录呢?如果您还想要那些您可能想要使用包含日期时间值的列。

从数据库中删除的记录会更复杂一些。您无法检索具有基本查询的那些。您可以通过为从数据库中检索的每条记录设置TTL来解决这个问题,就像缓存一样。当记录“过期”时,您尝试再次检索它。

某些数据库(如Microsoft SQL Server)也为此提供了更多高级选项。您可以通过代理服务使用查询通知,或在数据库上启用更改跟踪。最后一个甚至可以指出每条记录的最后一个动作(插入,更新或删除)。

答案 2 :(得分:0)

以下作品

using (readNext = command.ExecuteReader())
{
    while (readNext.Read())
    {
        abc = readNext.FieldCount;
        for (int s = 1; s < abc; s++)
        {
            var nextValue = readNext.GetValue(s);
        }
    }

}

For Loop读取当前行,然后While Loop移动到下一行