我在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中,但是使用數據適配器時會觸發(也不抱怨)。
感謝您的時間和幫助!
馬文
提示:「插入」和「刪除」是表格,以便它們可以表示設置操作的結果。假設它們總是包含一行,設計一個觸發器通常是一個糟糕的計劃。如果你絕對肯定不會有多於一行的話,那麼_please_添加一個檢查行數的檢查,並使用'RaIsError'來明確地告訴那些稍後來到的人他們已經試圖執行一個不可接受的語句。 ('if(從插入中選擇Count(*))> 1 RaIsError('FooTable_Insert:不會超過一行可以被處理',25,42)with log') – HABO 2014-11-25 03:10:34
感謝您的回答。經過對觸發器的一對多插入問題的一些研究後,我很確定重寫觸發器來處理多個插入將解決我的問題。一旦我累了,我會再次發佈。 – user2502832 2014-11-25 07:14:54