我正在尝试读取在计时器上添加到数据库的所有新行。
首先,我读取了整个数据库并将其保存到本地数据表,但是我想读取所有添加到数据库的新行。这是我尝试阅读新行的方式:
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;
}
}
如果在计时器中只添加了1行,则可以正常工作,但是当添加多个行时,仅读取最新的行。
所以有什么方法可以阅读所有添加的行。
我正在使用OledbDataReader
。
预先感谢
对于大多数表来说,主键是基于增量值。这可能是一个非常简单的整数,它会被一个增量,但也可以是基于DateTime的GUID。
无论如何,如果您知道上一个记录的ID。您可以简单地要求所有具有"更高" ID的记录。这样,您确实获得了新的记录,但是更新的记录呢?如果您也想要那些,则可能要使用包含DateTime值的列。
更棘手的是从数据库中删除的记录。您无法检索那些基本查询的人。您可以通过为从数据库中检索的每个记录设置一个TTL来解决该问题,就像缓存一样。当记录"过期"时,您会尝试再次检索。
Microsoft SQL Server(例如Microsoft SQL Server)的一些数据库还为此提供了更高级的选项。您可以通过代理服务使用查询通知,也可以在数据库上启用更改跟踪。最后一个甚至可以指示每个记录的最后一个动作是什么(插入,更新或删除)。
您的直接问题在这里:
while (readNext.Read())
{
doSomething();
break;
}
这是您的循环基本上归结为。break
在处理第一个项目后将退出循环,无论有多少个项目。
在这种情况下,第一个项目可能是最后一个添加的(如您所述),因为您是通过下达ID
进行排序的。
仅读取新添加的行,有多种方法可以做到这一点,有些将取决于您正在使用的DBM。
也许最简单,最便携的是添加一个额外的列processed
,该列将首先添加时设置为false。
这样,您可以简单地找到查找这些记录的查询,并为每个记录进行处理并将列设置为true。
实际上,您可以使用触发器来执行此操作(在插入时将标志迫使标志false),这也打开了使用更新的可能性。
跟踪删除更加困难,但仍然可以实现。您可以有一个触发器,它实际上将记录写入单独的表之前,然后删除它,以便您的处理代码也可以访问这些详细信息。
以下工作
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
移至下一个行