C#/SQL 监听器告诉我一行是不是已插入到表中

Posted

技术标签:

【中文标题】C#/SQL 监听器告诉我一行是不是已插入到表中【英文标题】:C# / SQL Listener to tell me if a row has been inserted into a tableC#/SQL 监听器告诉我一行是否已插入到表中 【发布时间】:2011-09-15 22:34:00 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

您能否更具体地提供答案?尽量避免第三方链接。【参考方案2】:

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

Create Your First CLR Trigger in SQL Server

CLR Triggers

【讨论】:

【参考方案3】:

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

SqlDependency 非常适合缓存场景,在这些场景中,您的 ASP.NET 应用程序或中间层服务需要将某些信息缓存在内存中。 SqlDependency 可以让你在数据库中的原始数据发生变化时收到通知,以便刷新缓存。

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

【讨论】:

SqlDependency 使用代理服务。但是broker服务总是在服务器上开启的,你应该在使用sqldependency的数据库上开启它。【参考方案4】:

我还建议在 db 中的某处注册插入的触发器(无论如何您都必须轮询数据库,如果触发器修改具有单行的特殊表,这不会那么昂贵)。但是如果你的主键上有 IDENTITY,你可以监控表的当前身份的值:

SELECT IDENT_CURRENT('TableName')

不过,这是一种 hack,但速度很快,而且您不需要修改数据库(当然,它仅适用于插入操作)。但是,如果轮询之间的标识值被显式修改并且完全设置为之前轮询时的值,则您可以跳过插入操作(虽然这不太可能)。

【讨论】:

顺便说一句,即使表没有修改,身份值也可能发生变化(事务回滚时,身份值不会恢复)。【参考方案5】:

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

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

【讨论】:

如果您需要进一步的帮助,请告诉我 CLR 触发器可能是但不是简单的 sql 触发器【参考方案6】:

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

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

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

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

您需要将 security permissions 授予您的 Sql Server 用户才能实现这一点,但如果这是可以接受的,那么这将在不使用代理的情况下工作。

【讨论】:

问题是我无权访问 sql server 上的任何设置,而且我的访问权限有限。所以,我只想要一个类似于 FileSystemWatcher 的数据库监听器。我知道这是可能的,因为我之前有两个不同的开发人员编写流程。一个是java,另一个是c#...感谢您的输入..非常感谢。【参考方案7】:

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

除此之外,您并没有给我们太多帮助。您使用的是什么版本的 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?

【讨论】:

在两个不同的场合,我让程序员编写了一个没有使用任何数据库内置功能的监听器。在 java 和 c# 中一定有一个类允许数据库具有类似 FileSystemWatcher 的功能。因此,它绝对可以做到,而且是实时的。到目前为止我只实现了一个文件监听器,但我更喜欢监听一个 sql 表。 有趣。我不知道有任何类似的事情不使用任何数据库引擎功能进行通知。老实说,我不相信有任何东西可以在不定期轮询数据库表的情况下进行实时通知。不过祝你好运。 @greg 我很想知道你是如何解决这个问题的。当你弄清楚我的问题时,你能对我的问题添加评论吗?

以上是关于C#/SQL 监听器告诉我一行是不是已插入到表中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VBA 将“整个”DAO 记录集插入到表中

(Golang)将数组中的所有行插入到表中

并发 SQL 插入正在阻塞到表

使用单个 INSERT 语句将多行插入到表中

MySQL如何将变量插入到表中

在循环中将字符串插入到表中