我花了一整天的时间试图弄清楚如何才能捕获特定列中的值已更改以触发一些计算。我正在使用 C# 和 MS Access 数据库。
我的数据库中有 3 列:时间、罢工和卷。
我只对 vol 列发生更改感兴趣,以便触发计算。
我查看了委托和事件,但我认为应该有一种更简单的方法。
你们知道该怎么做吗?
非常感谢 !
虽然 Access 数据库不提供真正的 TRIGGER 功能,但如果您使用 Access 2010 或更高版本,您可能会发现数据宏很有帮助。您可以添加一个 [volChanged] 列(是/否,索引(重复确定)),然后创建以下“更改前”数据宏:
If Updated("vol") Then
SetField
Name volChanged
Value =True
End If
一旦该宏就位,对任何记录上的 [vol] 字段的更改都会将该记录的 [volChanged] 标志更改为True
. 在具有两条记录的示例表上,这两条记录的 [volChanged] 都设置为False
,以下 Excel VBA 代码...
Sub volChangeTest()
Dim con As ADODB.Connection, rst As ADODB.Recordset, sql As String
Set con = New ADODB.Connection
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=C:\Users\Gord\Desktop\Database1.accdb;"
Set rst = New ADODB.Recordset
rst.Open "SELECT COUNT(*) AS n FROM volTable WHERE volChanged", con
Debug.Print "[volChanged] is True for " & rst(0).Value & " record(s)"
rst.Close
sql = "UPDATE volTable SET vol = vol + 1"
Debug.Print sql
con.Execute sql
rst.Open "SELECT COUNT(*) AS n FROM volTable WHERE volChanged", con
Debug.Print "[volChanged] is True for " & rst(0).Value & " record(s)"
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing
End Sub
...产生以下结果:
[volChanged] is True for 0 record(s)
UPDATE volTable SET vol = vol + 1
[volChanged] is True for 2 record(s)
数据宏本身不能触发任何外部进程,但是因为 [volChanged] 字段很小并且被索引,您可以以最小的开销非常频繁地查找“更新”,当然比在某处维护“旧值”列表并使用它来逐行搜索更改。
将表的本地副本保存在数组中,然后定期将访问表与您在数组中的表进行比较,然后在检测到更改时启动您的功能。