2013-08-19 9 views
11

我想知道這是否可能。當特定表中的值更新時,我們希望函數能夠在我們的.NET代碼中工作。這可能是在記錄插入或更新時。這可能嗎? 如果沒有,是否有其他過程?在表更新,在我的.NET代碼中觸發一個動作

+0

爲什麼不在數據庫端添加一個觸發器..?這將是我的第一個方法,你不必做任何不必要的往返數據庫,也請你的問題更詳細 – MethodMan

+0

DJ KRAZE方法不是一個糟糕的呼喊。代碼是否必須立即執行?如果不是,您可以使用觸發器更新某種形式的登臺表,然後創建一個針對該表運行的獨立控制檯應用程序,檢查發生了哪些變化,並根據預定義的預定時間運行特定的代碼。 – Modika

+0

@Modika這是我們最初的想法。但是,這取決於我們在該應用程序上設置的時間間隔。但是,我們確實需要立即運行代碼。 – alwaysVBNET

回答

9

你需要問幾個問題。

你想在數據庫級別的業務邏輯嗎? 很明顯,一個數據庫觸發器可以做到這一點(當值改變時執行一些操作,即使只有非常具體的值)。

我見過一些系統,數據庫觸發沉重。他們的'邏輯'與db平臺息息相關。這樣做有一些優點,但大多數人可能會說缺點太大了(耦合,缺乏封裝/可重用性)。

取決於你在做什麼和你的傾向你可以:

  1. 確保所有的DAO/BusinessFunctoin對象調用你的「事件」 object.function做的時候一定值發生變化時,你想要什麼。

  2. 當某個值發生變化時,使用觸發器調用您的'事件'object.function

  3. 您的觸發器可以完成所有功能。

我個人的偏向選項2,你有一個最小的觸發器(它只是觸發事件調用您的object.function),這樣你就不會深深的情侶你的數據庫到你的業務邏輯。

選項1是好的,但可能有點麻煩,除非你有一個非常窄的BF/DAO的談話這個數據庫table.field你想看。

選項3是imho最糟糕的選擇,因爲您將邏輯耦合到數據庫並降低其對業務邏輯層的可訪問性。

鑑於此,這裏是朝着通過選項2完成一些這方面的信息:

使用從MSDN這個例子:http://msdn.microsoft.com/en-us/library/938d9dz2.aspx

這顯示瞭如何讓一個觸發器運行並在項目中調用一個CLR對象。

實際上,在您的項目中,您將創建一個觸發器並讓它調用您的類。

通知行:[SqlTrigger(Name="UserNameAudit", Target="Users", Event="FOR INSERT")]

這定義了代碼大火,然後內的代碼,你可以檢查你的約束,那麼火的方法(或沒有)的其餘部分,或者調用另一個object.method需要。

直接進入數據庫並添加觸發器的主要區別在於,您可以在部署到一起時訪問項目中的所有對象。

+0

2)當某個值發生變化時,使用觸發器來調用你的'event'object.function。問題是我們該如何做到這一點?! – alwaysVBNET

+1

下面是從MSDN的例子: http://msdn.microsoft.com/en-us/library/938d9dz2.aspx 實際上,在你的項目,你創建一個觸發,並有它調用你的類。注意行: 這個定義了當代碼在代碼中觸發時,你可以檢查你的約束條件,然後觸發該方法的其餘部分或根據需要調用另一個object.method。 直接進入數據庫和添加觸發器的區別在於,您可以在部署到一起時訪問項目中的所有對象。 – williambq

+0

這實際上非常好,可能比其他解決方案更好。你可以回答這個問題,我會接受它。非常感謝 – alwaysVBNET

3

我從來沒有嘗試過,但它是可能的。您可以編寫一個CLR程序集並從您的表格觸發器中調用它。

您可以看到一個示例here

但是你應該發佈你的問題,你可能會發現更好的解決辦法。

相關問題