如何从.NET应用程序中检索插入表中的新行?

时间:2013-07-17 10:33:11

标签: c# .net sql sql-server events

我正在使用C#和Microsoft SQL Server Express 2008.该表将由远程硬件填充,因此我无法控制插入的SQL命令。我可以设置SQL服务器以在C#(或其他.NET)应用程序中插入可捕获的事件生成事件吗?

4 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,如果我,那么我会做像......这样的事情。

在该表上写入插入触发器并在该触发器中调用exe

例如:

declare @sqlcmd varchar(200)

SET @SQLCmd = 'c:\dba\sampl_2.exe'

EXEC master..xp_cmdshell @SQLCmd , no_output 

并且在那个exe中你可以处理你想要的任何东西......

答案 1 :(得分:0)

可能您正在寻找:SqlDependency class

但据我记得SQL Server Express不支持SqlDependency功能。 如果是这样,我会再创建一个列,比如“IsProcessed”,一旦应用程序处理该行,就将其设置为true或者其他内容。通过使用此方法,您可以使用where子句查询表:其中IsProcessed为null。

答案 2 :(得分:0)

有几种选择可以做这样的事情。在SQL中设置插入触发器很容易,可以有效地触发一个事件,在此期间可以执行任意数量的任务:发送消息,写入另一个表,写入日志。等。

对我来说,问题是你如何最好地让你的C#程序“监听”这个触发事件。

一个选项可能是将一个小WCF程序设置为侦听器,以便在插入触发器触发时响应SQL Server发送的消息。这是一个CodeProject关于做类似事情的链接。

http://www.codeproject.com/Articles/21149/Invoking-a-WCF-Service-from-a-CLR-Trigger

答案 3 :(得分:0)

有趣的是,这种问题是如何在SO上不时出现的。并且在所有情况下都没有明确的唯一答案。

实际上,问题是如何在SQL Server中为特定表捕获多插入事件。我希望它是一个特定的表,因为在SQL Server本身中没有一种方法可以同时监听所有表的DML更改(类似 * 来自表)。如果需要,可以在N个表上创建N个触发器(可以使用动态SQL完成)并监听这些触发器,但是如果添加了新表会怎么样?

我们认为我们有一个特定的表MyTable,我们希望监听INSERT,UPDATE和DELETE事件。一种方法是实现一个触发器(特别是AFTER触发器,因为在这种情况下不会产生INSTEAD OF触发器)。另一种选择是查询通知。但你真的需要哪一个?

查询通知意味着您必须编写.NET应用程序代码。触发器意味着与触发器相关的所有内容:您可以拥有TSQL代码,甚至可以使用CLR触发器从数据库中调用Web服务。但是 - 你需要什么?

因此,如果您真的需要在表中编写日志记录的方式做出反应,请使用普通旧触发器。否则你应该想:你为什么需要真正需要C#应用程序?

例如,假设您需要捕获delete语句并将XML格式的所有已删除行序列化到文件中的文件系统。我会在EXTERNAL_ACCESS模式下使用CLR触发器来创建文件并将信息保存到磁盘。

相关问题