在sql数据库中查看表新记录

我在Windows应用程序中使用EF,我希望我的应用程序在某个表中插入新记录时执行某些任务“这些新记录将由使用相同数据库的网站插入”
我的问题是如何观看此表进行更改并在新记录到来时收到通知,并且在这种情况下EF可以帮助我吗?

更新:我使用了SqlDependency类并在db中使用了它

ALTER DATABASE UrDb SET ENABLE_BROKER

并且还在数据库http://screencast.com/t/vrOjJbA1y中创建了一个服务和一个队列,但我从未收到来自我的Windows应用程序的通知。
此外,当我在sql server中打开队列时,它总是空的http://screencast.com/t/05UPDIwC8ck接缝有错误但我不知道。

以下是我的主张:

  1. 如果您能够将重复的表添加到数据库,那么这是一个解决方案。 你有你的table1table2table1的副本)。 向table1插入新记录时,可以将它们与table2中的现有记录进行比较,从而找到新记录。 比较后,您应该将所有新记录添加到table2 。 这是某种同步。 这可以通过存储过程或以编程方式进行。

  2. 您不需要任何其他表。 您可以将所有数据存储在应用程序缓存中,并检查一段时间(例如5秒)是否存在缓存中不存在的任何新事件。 如果它们不存在 – 在日志或其他位置通知它们并将它们添加到缓存中。 但是如果记录太多,处理时间将大大增加+内存消耗。

  3. 如果您能够更改数据库,则可以在表中添加“isNew”列等内容。 当新数据来自网站时,该列将为“true”,您的程序可以跟踪此数据,并且在处理之后将每个记录的此标志设置为false。 (如果网站无法设置此标志,您可以使用SQL TRIGGER AFTER INSERT将标志值设置为true。如果是第三方网站或者您不希望网站甚至无法了解此function改变任何东西)

  4. 以下是关于EF变更跟踪的文章: http : //blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with- poco.aspx

但问题是你应该通过EF检查整个表格是否会影响你的应用程序性能。

以下是有关SQL Server端更改跟踪和实现概念的有用信息: http : //www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/ http://msdn.microsoft。 COM / EN-US /库/ bb933994.aspx

请参阅更改数据捕获 ,特别是sys.fn_cdc_get_max_lsn 。 这将创建一个寻找变化的地方。

然后,编写存储过程以轮询该视图。 让它捕获先前的值,并循环查找适合您的数据到达率的WAITFOR延迟的更改。

当程序注意到最高LSN已经改变时,让它做一些事情。 它可以选择行。 它也可以只打印一条消息。 然后它返回其投票站(原样)。

打印消息可能听起来很奇怪,不知道关于EF的第一件事(并且对这些事情严重过敏)我不知道它是否会对你有所帮助。 但原则上应该是因为潜在的沟通存在。

从您的应用程序中,调用该过程。 当过程执行T-SQL PRINT (或RAISERROR )语句时,将向客户端发送一条消息。 如果它进入EF或你如何处理它,我不能说,但它应该在某个地方有用,因为在一般情况下它会显示给用户。 在您的情况下,您的应用程序将查找特定的消息号或文本,并做出相应的反应。 (其他消息,当然,你想要正常处理。)

这种方法非常便宜且非常简单。 它几乎不使用任何服务器资源,仅在发生更改时才向客户端发送消息,不使用额外的表,几乎不依赖于用户编写的代码,并且可以通过查看sysprocesses来validation它们是否正在运行。

您可以创建一个SQLCLR触发器FOR INSERT to table。 此触发器可以调用您可以在应用程序中托管的简单WCF服务。 带有触发器的程序集需要在SQL Server中注册。 看这里怎么做。

另一种方法(最简单的方法):使用普通的SQL触发器监视INSERT到表并使用类似“copy nul / Y some_file_with_path.txt”的命令执行xp_cmdshell。您的应用程序可以使用FileSystemWatcher类来监视对同一文件的修改。 配置filter以仅监视对此特定文件的上次访问。 看这里怎么做。 需要在SQL Server上定义xp_cmdshell的代理帐户。

我刚才面临同样的问题。 我也无法使SQl通知工作。

另一个建议是使用钩子覆盖SaveChanges并执行自定义逻辑。

https://stackoverflow.com/a/7654423/989679,https://github.com/kmckelvin/EFHooks/blob/master/EFHooks/HookedDbContext.cs http://thedatafarm.com/blog/data-access/objectcontext -savechanges-is-now-virtual-overridable-in-ef4 / ( archive )

如何存储由网站插入的交易信息的交易表。

在插入表上,您将为insert创建一个触发器,将新记录放入事务表中。

然后你只需要你的Windows应用程序定期检查事务表,当它找到你想做的事情,然后清除事务表上的记录。

它不是很优雅,但它可能会起作用。 我不熟悉EF,我不知道它是否有更好的解决方案。

或者使用SqlTableDependency: https ://tabledependency.codeplex.com/。 此开源组件向您发送一个事件,其中包含有关表中新行的记录详细信息