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实例之外,但在这里并不重要)。谷歌关于你的例外或张贴另一个问题,因为你可能有一些配置问题。希望你能完成。