【发布时间】:2014-11-25 02:25:13
【问题描述】:
我在 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) -
感谢您的回答。在对触发器的一对多插入问题进行一些研究之后,我非常确定重新编写触发器以处理多个插入将解决我的问题。累了我会再发一次。
标签: c# sql sql-server triggers sqldataadapter