Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测触发器何时触发?_C#_Sql Server_Winforms_Windows Services_Service Broker - Fatal编程技术网

C# 如何检测触发器何时触发?

C# 如何检测触发器何时触发?,c#,sql-server,winforms,windows-services,service-broker,C#,Sql Server,Winforms,Windows Services,Service Broker,我有一个项目,我必须发送电子邮件给我的客户时,一个产品被购买。我一直在与其他开发人员交谈,我们得出结论,完成该项目有三个主要步骤: 创建一个触发器,该触发器将在数据插入sales表时触发 创建一个Windows服务,以便在触发此触发器时“监视” 用于发送电子邮件的WinForms应用程序 我知道如何通过WinForms应用程序发送电子邮件,所以第3步可以。 我阅读了有关ServiceBroker的信息,并在我的数据库中启用了它。此外,我还创建了触发器,以便在插入或更新数据时通过ServiceBr

我有一个项目,我必须发送电子邮件给我的客户时,一个产品被购买。我一直在与其他开发人员交谈,我们得出结论,完成该项目有三个主要步骤:

  • 创建一个触发器,该触发器将在数据插入sales表时触发
  • 创建一个Windows服务,以便在触发此触发器时“监视”
  • 用于发送电子邮件的WinForms应用程序
  • 我知道如何通过WinForms应用程序发送电子邮件,所以第3步可以。 我阅读了有关ServiceBroker的信息,并在我的数据库中启用了它。此外,我还创建了触发器,以便在插入或更新数据时通过ServiceBroker发送消息。我紧随其后,想出了这个触发器:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TRIGGER SendServiceBroker
       ON  dbo.Sales
       AFTER INSERT,UPDATE
    AS 
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @ch UNIQUEIDENTIFIER
        DECLARE @msg NVARCHAR(MAX) ;
        BEGIN DIALOG CONVERSATION @ch
            FROM SERVICE [InitiatorService]
            TO SERVICE 'TargetService'
            ON CONTRACT [http://ssb.csharp.at/HelloWorldContract]
            WITH ENCRYPTION = OFF ;
            SET @msg = '<HelloWorldRequest>
                            Gabriela
                        </HelloWorldRequest>' ;
            SEND ON CONVERSATION @ch 
            MESSAGE TYPE [http://ssb.csharp.at/RequestMessage] 
            (@msg) ;
    END
    GO
    
    将ANSI_空值设置为ON
    去
    在上设置带引号的\u标识符
    去
    创建触发器SendServiceBroker
    论dbo.销售
    插入后,更新
    作为
    开始
    不计数;
    声明@ch UNIQUEIDENTIFIER
    声明@msg NVARCHAR(最大值);
    开始对话@ch
    来自服务[发起人服务]
    服务“目标服务”
    合同上[http://ssb.csharp.at/HelloWorldContract]
    加密=关闭时;
    设置@msg=
    加布里埃拉
    ' ;
    发送对话@ch
    消息类型[http://ssb.csharp.at/RequestMessage] 
    (@msg);
    结束
    去
    
    另外,我在Microsoft的GitHub页面中找到了a的代码。我在电脑上安装了这项服务,然后在销售表中插入了一些数据,但什么也没发生。 我曾想过直接在触发器上发送电子邮件(使用
    sp\u send\u dbmail
    ),但我没有这样做的必要权限。
    我认为在整个过程中我缺少了一些东西来让它正常工作,但我不知道我必须做些什么才能使它正常工作。

    每次在创建它的对象上使用它所“绑定”的DML语句时,都会触发一个触发器。在这种情况下,触发器将在表
    dbo.Sales
    上的每个
    UPDATE
    INSERT
    语句完成后发生。另外,不要在
    触发器中声明事务。
    触发器
    已经封装在DML语句的事务中。执行
    开始事务
    提交
    回滚
    等操作可能会导致意外行为。处理触发器外部的事务,而不是触发器内部的事务。好的,我从触发器中删除了
    BEGIN TRANSACTION
    COMMIT TRANSACTION
    ,并插入了新数据,但我仍然不知道下一步要做什么。我想下一步应该是根据我读到的内容查看RECEIVE tsql命令,我需要使用C#Windows服务中的Service Broker消息处理器来获取收到的消息。。。正确的?