C# SQL Server中的.Net SqlDataAdapter和触发器
我正在SQL Server中使用一个触发器,在SQL Server Management Studio的查询窗口中执行查询时,该触发器会根据需要工作。触发器的目标是从一个表中获取最新的值,其中一个id对应于插入的id,并将该值添加到插入的行中 我还在C中使用DataAdapter与具有触发器的同一数据库进行交互。当我使用MyAdapter.updateMyDataTable向触发器分配的表中插入新值时,触发器不会执行 我用谷歌搜索了很多次,但似乎没有其他人有这个问题,所以我认为我遗漏了一些基本的东西。我还不熟悉与.Net的数据库交互。数据适配器工作正常,即根据需要插入和更新,但不触发触发器除外 下面是我的C代码和触发器的一些摘录C# SQL Server中的.Net SqlDataAdapter和触发器,c#,sql,sql-server,triggers,sqldataadapter,C#,Sql,Sql Server,Triggers,Sqldataadapter,我正在SQL Server中使用一个触发器,在SQL Server Management Studio的查询窗口中执行查询时,该触发器会根据需要工作。触发器的目标是从一个表中获取最新的值,其中一个id对应于插入的id,并将该值添加到插入的行中 我还在C中使用DataAdapter与具有触发器的同一数据库进行交互。当我使用MyAdapter.updateMyDataTable向触发器分配的表中插入新值时,触发器不会执行 我用谷歌搜索了很多次,但似乎没有其他人有这个问题,所以我认为我遗漏了一些基本的
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中工作,但在使用数据适配器时不会触发或抱怨
谢谢你的时间和帮助
马文插入后触发。使用SQLDataAdapter执行更新。这是两种截然不同的交易类型
尝试将触发器设置为更新时。这应该可以解决问题。根据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
谢谢你的帮助 提示:插入和删除是表,因此它们可以表示集合操作的结果。在假设触发器总是只包含一行的情况下设计触发器通常是一个糟糕的计划。如果您绝对确定不会有超过一行,那么请添加对行数的检查,并使用RaIsError明确通知稍后出现的人,他们试图执行不可接受的语句。如果选择Count*from inserted>1,则会出现错误“FooTable_Insert:最多只能处理一行”。、25、42和Log感谢您的回答。在对触发器的一对多插入问题进行了一些研究之后,我非常确定重新编写触发器以处理多个插入将解决我的问题。我一累了就会再发。谢谢你的回答。1.要理解,adapter.update可以根据在数据表中所做的更改执行任何插入、删除或更新操作。不是这样吗?2.我确实尝试过使用ON UPDATE而不是ON INSERT,这并没有解决问题。是的,这是正确的,我没有看到您也添加了INSERT命令。