我花了一整天試圖找出我怎麼能捕獲特定列中的值以觸發一些計算已經改變了改變。我正在使用C#和MS Access數據庫。如何捕捉值已經在數據庫中使用C#
我在我的數據庫3列:時間,罷工和卷。
我只有在發生的體積變化列,所以我可以觸發計算感興趣。
我看着委託和事件,但我覺得應該有這樣做的更簡單的方法。
你們知道該怎麼做嗎?
非常感謝!
我花了一整天試圖找出我怎麼能捕獲特定列中的值以觸發一些計算已經改變了改變。我正在使用C#和MS Access數據庫。如何捕捉值已經在數據庫中使用C#
我在我的數據庫3列:時間,罷工和卷。
我只有在發生的體積變化列,所以我可以觸發計算感興趣。
我看着委託和事件,但我覺得應該有這樣做的更簡單的方法。
你們知道該怎麼做嗎?
非常感謝!
保持表的本地副本中的數組,然後定期比較訪問表給你數組中有一個,然後如果你發現一個變化火了你的功能。
雖然Access數據庫並不提供真正的觸發功能,你可能會發現一個數據宏有益的,如果您使用的Access 2010或更高版本的工作。你可以添加一個[volChanged]列(是/否,索引(重複OK)),然後創建以下「之前更改」數據宏:
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]字段很小並且被索引,所以可以以最小的開銷頻繁地查找「更新」,當然少於在某個地方維護一個「舊值」列表並使用它來搜索用於逐行更改。
@Mike我可能是錯的,但它聽起來像OP正在編寫一個程序來使用Access數據,而不是直接從Access工作。我同意OP正在尋找的解決方案將需要一些Access端編程,但我不知道在這種情況下這是可能的。如果可能的話,他們仍然會停留在投票而不是事件驅動模型。 – 2013-05-01 22:07:16
@MichaelTodd創建數據宏是唯一需要的Access-side編程。檢查更新將涉及到在我的示例代碼中執行像SELECT COUNT(*)...語句。這可以在任何地方完成,例如C#應用程序或Windows中的計劃任務。是的,他們仍然在進行輪詢,但與沒有數據宏相比,它的成本要低得多,完全由事件驅動的模型根本不適用於ACE後端。 – 2013-05-01 22:14:04
您是否正在檢查一行或任何行上的更改? – Chris 2013-05-01 19:49:08
我需要檢查特定列中每一行是否有變化 – Mike 2013-05-01 19:59:39
變化是否發生在程序控制之外? – 2013-05-01 20:04:02