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

C# 如何从数据库中读取所有新行?,c#,oledbdatareader,C#,Oledbdatareader,我正试图通过计时器读取添加到数据库中的所有新行 首先,我读取整个数据库并将其保存到本地数据表中,但我希望读取添加到数据库中的所有新行。以下是我如何尝试阅读新行: string accessDB1 = string.Format("SELECT * FROM {0} ORDER BY ID DESC", tableName); setupaccessDB(accessDB1); int dTRows = localDataTable.Rows.Count + 1; localDataTable.

我正试图通过计时器读取添加到数据库中的所有新行

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

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;
    }
}
stringaccessdb1=string.Format(“按ID DESC从{0}顺序选择*”,tableName);
setupaccessDB(accessDB1);
int dTRows=localDataTable.Rows.Count+1;
localDataTable.Rows.Add();
使用(readNext=command.ExecuteReader())
{
while(readNext.Read())
{
对于(int xyz=0;xyz
如果在计时器中只添加了一行,则可以正常工作,但当添加多行时,只读取最新的行

那么有什么方法可以读取所有添加的行呢

我使用的是
OledbDataReader


提前感谢

您当前的问题在于:

while (readNext.Read())
{
    doSomething();
    break;
}
这就是你的循环基本上归结为什么。无论有多少项,
break
将在处理第一项后退出循环

在本例中,第一项可能是最后添加的一项(如您所述),因为您是按降序
ID
排序的

就只读取新添加的行而言,有多种方法可以做到这一点,有些方法取决于您使用的DBMS

也许最简单和最可移植的方法是添加一个额外的列
processed
,当第一次添加行时,该列被设置为false

这样,您就可以使用一个查询来查找这些记录,并对每个记录进行处理,然后将列设置为true

事实上,您可以使用触发器来执行此操作(在插入时强制标志为false),这也为使用更新执行此操作提供了可能性


跟踪删除稍微有点困难,但仍然可以实现。您可以有一个触发器,在删除记录之前将其实际写入一个单独的表中,以便您的处理代码也可以访问这些详细信息。

您当前的问题在于:

while (readNext.Read())
{
    doSomething();
    break;
}
这就是你的循环基本上归结为什么。无论有多少项,
break
将在处理第一项后退出循环

在本例中,第一项可能是最后添加的一项(如您所述),因为您是按降序
ID
排序的

就只读取新添加的行而言,有多种方法可以做到这一点,有些方法取决于您使用的DBMS

也许最简单和最可移植的方法是添加一个额外的列
processed
,当第一次添加行时,该列被设置为false

这样,您就可以使用一个查询来查找这些记录,并对每个记录进行处理,然后将列设置为true

事实上,您可以使用触发器来执行此操作(在插入时强制标志为false),这也为使用更新执行此操作提供了可能性


跟踪删除稍微有点困难,但仍然可以实现。您可以有一个触发器,在删除记录之前将其实际写入一个单独的表中,以便处理代码也可以访问这些详细信息。

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

无论如何,如果你知道最后一条记录的id。您可以简单地请求具有“更高”id的所有记录。这样您就可以获得新记录,但更新的记录呢?如果您还需要这些,您可能需要使用包含datetime值的列

更棘手的是从数据库中删除的记录。无法使用基本查询检索这些内容。您可以通过为从数据库检索的每个记录设置一个TTL来解决这个问题,就像缓存一样。当记录“过期”时,您将再次尝试检索它


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

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

无论如何,如果你知道最后一条记录的id。您可以简单地请求具有“更高”id的所有记录。这样您就可以获得新记录,但更新的记录呢?如果您还需要这些,您可能需要使用包含datetime值的列

更棘手的是从数据库中删除的记录。无法使用基本查询检索这些内容。您可以通过为从数据库检索的每个记录设置一个TTL来解决这个问题,就像缓存一样。当记录“过期”时,您将再次尝试检索它

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

以下操作有效

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

}
使用(readNext=command.ExecuteReader())
{
while(readNext.Read())
{
abc=readNext.FieldCount;
对于(int s=1;s
循环读取当前行,然后循环
移动到下一行时

执行以下操作

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

}
使用(readNext=command.ExecuteReader())
{
while(readNext.Read())
{
abc=readNext.FieldCount;
对于(int s=1;s