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

标签 c# sql sql-server triggers sqldataadapter

我在 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/

相关文章:

c# - 基于列合并两个列表

c# - C# 中的 SQL 子查询

mysql - 将 MS-SQL 存储过程转换为 MYSQL,但现在由于语法错误而无法创建

SQL Server : Alter procedure on linked server

java - 如何将表值参数从java传递到sql server存储过程?

c# - 如何在 EF Core 中重命名一对多关系中的列?

c# - 是否可以使用 SolrNet 映射复杂类型

php - SQL:仅将新行/记录插入表中?

c# - 指针偏移导致溢出

sql - SQL 中偏移每一行的 Sumproduct