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

时间:2011-06-15 22:09:44

标签: c# sql-server triggers listener

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

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

7 个答案:

答案 0 :(得分:8)

您是否正在寻找SqlDependency类,以便在发生更改时通知您的代码注册?

  

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

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

答案 1 :(得分:2)

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

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


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

Exploring SQL Server Triggers

How to: Create and Run a CLR SQL Server Trigger

一个类似的问题,提出了另一种(更好的?)方式: Can SQL CLR triggers do this? Or is there a better way?

答案 2 :(得分:1)

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

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

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

然后使用您在应用程序中已经提到的FileSystemWatcher,以便在文件更改时收到通知。

您需要向您的Sql Server用户授予security permissions以使其成为可能,但如果可以接受,则可以在不使用代理的情况下使用。

答案 3 :(得分:1)

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

SELECT IDENT_CURRENT('TableName')

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

答案 4 :(得分:0)

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

Create Your First CLR Trigger in SQL Server

CLR Triggers

答案 5 :(得分:0)

按照" Damien"您需要使用sqldependency来检测更改。

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

答案 6 :(得分:-3)

触发听起来是最佳选择:

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 = <some_key_column>, @id2=<second_column> from inserted

    --do something with row's new values

    SET NOCOUNT OFF;
END