C#/ SQL Listener告诉我是否已将一行插入表中

有人可以发布示例代码或告诉我如何在SQL Server数据库中插入新行时如何设置监听器来通知我(触发事件)?

我不想使用任何SQL Server消息传递或代理服务。 我目前有一个文件监听器,它会在新行附加到平面文件时通知我。 我想对数据库表做同样的事情。

您是否正在寻找SqlDependency类,它允许您的代码注册在发生更改时得到通知?

SqlDependency是缓存方案的理想选择,其中ASP.NET应用程序或中间层服务需要将某些信息缓存在内存中。 SqlDependency允许您在数据库中的原始数据发生更改时接收通知,以便可以刷新缓存。

或者这是否属于你不允许的事情范围,这还不完全清楚?

您需要在插入时执行某种数据库触发器或定期轮询数据库以查找新记录。 我不推荐后一种建议,因为这可能是非常强大的性能。

除此之外,你并没有给我们太多的帮助。 您使用的是哪个版本的SQL Server? 你有什么尝试? 你遇到了什么问题?


以下是一些可能指向正确方向的链接:

探索SQL Server触发器

如何:创建和运行CLR SQL Server触发器

一个类似的问题暗示了另一种(更好的?)方法: SQL CLR触发器可以做到这一点吗? 或者,还有更好的方法?

您可以使用sql通知执行此操作,但您说您不想使用代理。 否则您可以轮询,但如上所述,这可能会导致性能问题。

另一种方法是使用数据库表上的触发器来触摸文件系统上的文件。

 exec master..xp_cmdshell 'echo changed > c:\temp\filewatcher.txt' 

然后使用FileSystemWatcher,如您所提到的,您已在应用程序中执行该操作以在文件更改时接收通知。

您需要向Sql Server用户授予安全权限才能实现此目的,但如果可以接受,则无需使用代理即可使用。

我还建议触发器在db中的某处插入寄存器(并且无论如何必须轮询数据库,如果触发器修改了具有单行的特殊表,则这不是那么昂贵)。 但是,如果您的主键上有IDENTITY,则可以监视表的当前标识的值:

 SELECT IDENT_CURRENT('TableName') 

然而,这是一个黑客,但它很快,你不需要修改你的数据库(当然,它只适用于插入操作)。 但是,如果在显式修改轮询标识值之间并且将其精确设置为上次轮询时的值(尽管不太可能),您可以跳过插入操作。

我会考虑CLR触发器,请阅读以下文章……

在SQL Server中创建您的第一个CLR触发器

CLR触发器

根据“Damien”,您需要使用sqldependency来检测更改。

msdn上的sqldependency示例: – https://msdn.microsoft.com/en-us/library/62xk7953(v=vs.110).aspx

触发器听起来最好的选择:

 create TRIGGER [tI_Notifier] ON [dbo].[your_table_name] AFTER INSERT AS BEGIN SET NOCOUNT ON; declare @id1 int --or same type as your key --declare other variables you want to read from the inserted row --read columns values from inserted row select @id1 = , @id2= from inserted --do something with row's new values SET NOCOUNT OFF; END