2014-11-25 43 views
3

我在SQL Server中使用觸發器,它在SQL Server Management Studio中的查詢窗口中執行查詢時按要求工作。觸發器的目標是從一個表中獲取最新值(其中一個id對應於插入的id)並將此值添加到插入的行。.Net SqlDataAdapter和SQL Server中的觸發器

我也在C#中使用DataAdapter與具有觸發器的同一個數據庫進行交互。當我使用MyAdapter.update(MyDataTable)向觸發器分配的表中插入新值時,觸發器不執行。

我做了大量的谷歌搜索,但沒有人似乎有這個問題,所以我想我失去了一些根本。我也是與.NET的數據庫交互的新手。數據適配器可以正常工作(即根據需要插入和更新),除非不觸發觸發器。

下面是我的C#代碼和觸發器的摘錄。

CREATE TRIGGER getLatestCap 
ON TestIDTable 
AFTER insert 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @BID INT; 
    DECLARE @Date Date; 

    SET @BID = (SELECT BattID FROM inserted); 
    SET @Date = (SELECT Test_Date FROM inserted); 

    SELECT M_Cap, Cap_Date 
    INTO #tempTable 
    FROM CapDataTable 
    WHERE BattID = @BID; 

    -- Set the Test_Cap entry in TestIDTable to that capacity. 
    UPDATE TestIDTable 
    SET Test_Cap = (SELECT M_Cap 
        FROM #tempTable 
        WHERE Cap_Date = (SELECT max(Cap_Date) 
             FROM #tempTable)) 
    WHERE BattID = @BID AND Test_Date = @Date; 
END 
GO 

private void Setup() 
{ 
     try 
     { 
      string BattSelect = "SELECT * FROM " + tbl; 
      dt = new DataTable(); 
      Adpt = new SqlDataAdapter(BattSelect, ConnectionStr); 
      builder = new SqlCommandBuilder(Adpt); 
      Adpt.Fill(dt); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("While Connecting to "+tbl+": " + e.ToString()); 
     } 
    } 

    private void UpdateDB() 
    { 
     try 
     { 
      Adpt.InsertCommand = builder.GetInsertCommand(); 
      Adpt.UpdateCommand = builder.GetUpdateCommand(); 
      Adpt.Update(dt); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("While Updating " + tbl + ": " + e.ToString()); 
     } 
    } 

問題總結:觸發工作在SQL Server中,但是使用數據適配器時會觸發(也不抱怨)。

感謝您的時間和幫助!

馬文

+2

提示:「插入」和「刪除」是表格,以便它們可以表示設置操作的結果。假設它們總是包含一行,設計一個觸發器通常是一個糟糕的計劃。如果你絕對肯定不會有多於一行的話,那麼_please_添加一個檢查行數的檢查,並使用'RaIsError'來明確地告訴那些稍後來到的人他們已經試圖執行一個不可接受的語句。 ('if(從插入中選擇Count(*))> 1 RaIsError('FooTable_Insert:不會超過一行可以被處理',25,42)with log') – HABO 2014-11-25 03:10:34

+0

感謝您的回答。經過對觸發器的一對多插入問題的一些研究後,我很確定重寫觸發器來處理多個插入將解決我的問題。一旦我累了,我會再次發佈。 – user2502832 2014-11-25 07:14:54

回答

2

以下HABO的提示(原始帖子下方)我修改了我的觸發器爲多個插入的行工作。這已經解決了我的問題。新的觸發代碼如下:

CREATE TRIGGER getLatestCap 
    ON TestIDTable 
    AFTER insert 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE TestIDTable 
    set Test_Cap = M_Cap 
    FROM 
     (SELECT C.BattID, Test_Date, M_Cap 
     FROM 
      (SELECT t.BattID, t.M_Cap, t.Cap_Date 
      FROM CapDataTable t 
      INNER JOIN(
       SELECT BattID, max(Cap_Date) as Latest 
       FROM CapDataTable 
       GROUP BY BattID 
      ) tm on t.BattID = tm.BattID and t.Cap_Date = tm.Latest) 

     C INNER JOIN inserted I 
      on C.BattID = I.BattID) as t1 
     INNER JOIN TestIDTable as t2 
     on t1.BattID = t2.BattID AND t1.Test_Date = t2.Test_Date 
END 
GO 

感謝您的幫助!

2

您在INSERT後觸發觸發器。使用SQLDataAdapter,您正在執行UPDATE。這是兩種完全不同的交易類型。

嘗試將觸發器設置爲ON UPDATE。這應該夠了吧。

+0

感謝您的回答。 1.要理解,adapter.update()可以執行INSERT,DELETE或UPDATE中的任何操作,具體取決於數據表中所做的更改。情況並非如此嗎? 2.我嘗試使用ON UPDATE而不是ON INSERT,但這並沒有解決問題。 – user2502832 2014-11-25 07:04:46

+0

是的,這是正確的,我沒有看到你添加了插入命令。 – 2014-11-25 07:14:36