我正在尝试读取计时器上添加到数据库的所有新行。
首先,我读取整个数据库并将其保存到本地数据表,但我想读取添加到数据库的所有新行。以下是我尝试阅读新行的方法:
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
。
提前致谢
答案 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
移动到下一行