C# 如何使用触发器?

C# 如何使用触发器?,c#,asp.net,triggers,sql-server-express,C#,Asp.net,Triggers,Sql Server Express,我有一个包含一些表的数据库, 每当一些数据写入表中时,我想在C#中运行一个方法 我知道我必须使用触发器,但我不知道如何使用 如果你能指导我,我将不胜感激 附言: 我正在使用SQLExpress 2008,我认为一种方法是创建一个用C#编写的函数或存储过程。例如,在SQL Server和DB2中,这是可能的。 然后触发器将能够调用此SQL Server函数/SP 但老实说,在我看来,这不是一个好的设计。在数据库中运行.NET代码有一些选项,但对我个人来说?我不会的。我希望我的数据库担心存储和获取数

我有一个包含一些表的数据库,
每当一些数据写入表中时,我想在C#中运行一个方法

我知道我必须使用触发器,但我不知道如何使用
如果你能指导我,我将不胜感激

附言:

我正在使用SQLExpress 2008,我认为一种方法是创建一个用C#编写的函数或存储过程。例如,在SQL Server和DB2中,这是可能的。 然后触发器将能够调用此SQL Server函数/SP

但老实说,在我看来,这不是一个好的设计。

在数据库中运行.NET代码有一些选项,但对我个人来说?我不会的。我希望我的数据库担心存储和获取数据,仅此而已。选项:

  • 使用触发器(或任何其他方法)填充事件队列,即另一个表;让你的C#应用程序在这张表格中查询要做的事情
  • 改为在应用层中编写代码(即,在执行数据更改命令时运行代码)

还考虑数据库的事务性质——这可能是,即使您已经做了插入/更新,事务也不会被提交(注意,在第一种方法中,如果正确地完成,第二个表的插入也将同时自动回滚)。ADO.NET提供了一个非常有用的类,称为SqlDependency。当数据库中指定的表发生更改时,您可以订阅一个

OnChange
事件

以下是文档和示例:

它看起来很漂亮,很管用

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
    // Assume connection is an open SqlConnection.

    // Create a new SqlCommand object.
    using (SqlCommand command=new SqlCommand(
        "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", 
        connection))
    {

        // Create a dependency and associate it with the SqlCommand.
        SqlDependency dependency=new SqlDependency(command);
        // Maintain the refence in a class member.

        // Subscribe to the SqlDependency event.
        dependency.OnChange+=new
           OnChangeEventHandler(OnDependencyChange);

        // Execute the command.
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // Process the DataReader.
        }
    }
}

// Handler method
void OnDependencyChange(object sender, 
   SqlNotificationEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}

void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}
但是,您必须在数据库中启用ServiceBroker才能接收这些通知。以下是如何做到这一点:

--Create login if you do not have already
--Example:
--CREATE LOGIN ChangesMonitor WITH PASSWORD = 'ChangesMonitor' ;
--GO

--Create user associated with this login and
--add provilages in Management Studio tab Security->Users
--(not sure if all are needed, but for test purposes add following):
--db_datareader, db_datawriter,  db_ddladmin, db_accesadmin, db_owner, db_securityadmin



--must have exclusiveness on database
--script for database SqlDependExample and for user ChangesMonitor
ALTER DATABASE SqlDependExample SET ENABLE_BROKER
GO

GRANT CREATE PROCEDURE TO [ChangesMonitor];
GO
GRANT CREATE SERVICE TO [ChangesMonitor];
GO

GRANT CREATE QUEUE TO [ChangesMonitor];
GO

GRANT REFERENCES ON CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] TO [ChangesMonitor];
GO
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [ChangesMonitor];
GO

GRANT CONTROL ON SCHEMA::[dbo] TO [ChangesMonitor];
GO

GRANT IMPERSONATE ON USER::DBO TO [ChangesMonitor];
GO 

是的,它不会影响您处理数据的方式。这只是一种通知机制。您可以将代码放在OnDependencyChange(上图)方法中,当表发生更改时将执行该方法。在我的网站上有一个示例项目:顺便说一句,我想用
OnDependencyChange
方法向客户返回一些东西。如果您指导我可以吗?您应该在数据库中执行sql脚本(最简单的方法是将代码粘贴到sql Server Management Studio,然后按execute)。记住通过替换用户名和数据库名来更改上述代码,以满足您的需要。我不知道你指的是什么样的客户。您可以在
onDependencyChange
方法中执行“任何”操作。此机制的核心是,当表发生更改(插入、更新行…)时,将执行您在其中放置的内容。例如,放在那里
Console.WriteLine(“表已更改”)我想使用你的代码,代码在
SqlDependency.Start
中抛出异常。它说我必须有SQL Server。我想用SQLExpress。您有没有办法不用安装SQL Server(仅使用SQL Express)就可以做到这一点?SQL Server 2008 Express支持Service Broker(除了连接两个SQL Server实例之外,但在这里并不重要)。谷歌关于你的例外或张贴另一个问题,因为你可能有一些配置问题。希望你能完成。