我在SQL Server中使用触发器,当在SQL Server Management Studio的查询窗口中执行查询时,它按要求工作。该触发器的目的是从一个表中获取最新值(其中一个ID对应插入的ID),并将此值添加到插入的行中。
我还在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中有效,但使用数据适配器时不会触发(也没有报错)。
感谢您的时间和帮助!
马文
inserted
和deleted
是表格,因此它们可以表示集合操作的结果。在设计触发器时,假设它们总是包含一行数据通常是一个不好的计划。如果您绝对确定永远不会有多于一行的情况,请添加一个检查行数的条件,并使用RaIsError
来明确告知那些随后尝试执行不可接受语句的人。 (if (select Count(*) from inserted) > 1 RaIsError('FooTable_Insert: No more than one row may be processed.', 25, 42) with log
) - HABO