1

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

4

4 回答 4

1

有很多方法可以做到这一点,如果我愿意的话,我会做类似的事情......

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

例如 :

declare @sqlcmd varchar(200)

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

EXEC master..xp_cmdshell @SQLCmd , no_output 

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

于 2013-07-17T10:53:29.227 回答
0

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

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

假设我们有一个特定的表 MyTable,我们想在其中监听 INSERT、UPDATE 和 DELETE 事件。一种方法是实现触发器(特别是 AFTER 触发器,因为在这种情况下不使用 INSTEAD OF 触发器)。另一种选择是查询通知。但你真正需要哪一个?

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

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

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

于 2013-07-17T11:45:52.270 回答
0

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

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

一种选择可能是设置一个小的 WCF 程序作为侦听器,在插入触发器触发时响应 SQL 服务器发送的消息。这是一个关于做类似事情的 CodeProject 文章的链接。

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

于 2013-07-17T10:50:15.627 回答
0

可能您正在寻找:SqlDependency 类

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

于 2013-07-17T10:42:44.513 回答