gpt4 book ai didi

c# - .Net SqlDataAdapter 和 SQL Server 中的触发器

转载 作者:行者123 更新时间:2023-11-30 15:27:39 25 4
gpt4 key购买 nike

我在 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 中工作,但在使用数据适配器时会触发(也不会报错)。

感谢您的宝贵时间和帮助!

马文

最佳答案

根据 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

感谢您的帮助!

关于c# - .Net SqlDataAdapter 和 SQL Server 中的触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27117779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com