有没有人知道从.Net应用程序监视SQL Server(2005或2008)数据库中的表记录更改的方法?它需要能够一次支持多个客户端。每个客户端在启动时都会“订阅”,并在退出时“取消订阅”。多个用户可以立即访问系统,我想在其他用户客户端上反映他们的更改。然后,当客户端处理更改事件时,它可以更新它表示该记录的本地对象。类似于修改的Access更新记录的方式反映在引用它的每个表单中。
我知道microsoft有他们的Microsoft.SqlServer库用于与SQL Server交互。但我不确定哪个概念适用于我想做的事情(或者可以弯曲以适用于我想做的事情)。听起来可能有用的是管理者或复制者。
期待有人问,“你为什么不偶尔重新询问桌子以寻找新的信息?”我有大量的桌子需要监控,这对屁股很痛苦。此外,如果我正在寻找更优雅的东西。
我愿意接受建议......
答案 0 :(得分:7)
要监视SQL 2005+中SQL表或记录的更改,可以使用SqlDependency类。
它的目标是在ASP.NET或中间层服务中使用,其中单个服务器正在管理针对数据库的活动订阅 - 而不是数百个管理订阅的客户端。根据您引用的最大客户端数量,您可能希望构建一个缓存池服务,该服务可以管理针对客户端的SQL通知订阅。
其中使用的是使用Service Broker的SqlNotificationRequest,而不是Notification Services。因此,这应该在SQL 2008等上继续进行。
void Initialization()
{
// Create a dependency connection.
SqlDependency.Start(connectionString, queueName);
}
void SomeMethod()
{
// Assume connection is an open SqlConnection.
// Create a new SqlCommand object.
SqlCommand command=new SqlCommand(
"SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers",
connection);
// Create a dependency and associate it with the SqlCommand.
SqlDependency dependency=new SqlDependency(command);
// Maintain the refence in a class member.
// Subscribe to the SqlDependency event.
dependency.OnChange+=new OnChangeEventHandler(OnDependencyChange);
// Execute the command.
command.ExecuteReader();
// Process the DataReader.
}
// Handler method
void OnDependencyChange(object sender,
SqlNotificationsEventArgs e )
{
// Handle the event (for example, invalidate this cache entry).
}
void Termination()
{
// Release the dependency.
SqlDependency.Stop(connectionString, queueName);
}
“Using and Monitoring SQL 2005 Query Notifications”文章介绍了在代码中设置它的步骤(使用Web应用程序作为示例)以及订阅Service Broker所需的相应SQL权限等。
ASP.NET (web caching)课程也适用于网络方案。
答案 1 :(得分:2)
在SQL Server 2008中,您有更改跟踪,您可以在发生插入,更新或删除时跟踪它。这将跟踪事件发生的情况,记录的情况以及可选的哪些列已更改但不是值(之前和之后)。这通常用于执行具有已知更改数据的批量处理。
在更改跟踪中,您可以设置保留期间来保存更改,通常是确保跟踪表的任何处理都在保留期内的时间段。
或者,您(再次,在SQL 2008中)更改数据捕获更精细并记录实际更改。但是,这只是一个企业功能。
您可以轻松创建.NET应用程序来运行更改跟踪或更改数据捕获查询。
以下是有关
的更多信息的链接在大多数情况下,更改跟踪可能是最佳选择 - 此外它适用于所有版本的SQL Server 2008。
如果要在2005年或更低版本中实现此目的,您基本上可以为要跟踪的每个表创建表,并触发在插入,更新,删除时将值插入跟踪表。然后有一个过程来清除它。这基本上就是变更跟踪为您所做的事情。
答案 2 :(得分:0)
我没有亲自使用它,但听起来像Notification Services值得一看
答案 3 :(得分:0)
此方案通常无法很好地扩展...您可以查看SQL通知服务,但这也有同样的问题。
在一个系统中,我通过使用触发器来编写(单个)增量表的更改的简短摘要,包括表,更改类型和行ID。每个客户端都维护着“我读到的地方”,并简单地询问所有ID为>的delta记录。这个号码。问题是您需要做一些聪明的事情来清理表格而不会破坏任何单个客户端更改历史记录...即跟踪注销,假设它们在给定时间内已经死亡,并在完成刷新时记录。
绝对可行,但很多工作。
答案 4 :(得分:0)
我想我误解了这个问题。
听起来这是一个带锁定控制的标准多用户应用程序。用户登录然后访问服务器上的数据(订阅)。用户注销(取消订阅)。
或者这是一个断开连接的应用程序,您想要同步更改吗?
对于断开连接的应用程序,您可以使用SQL Server的syncservices。
除此之外,只需使用LINQ to Entities,就可以在保存对象更改时处理冲突。为确保LINQ生成的查询具有高性能,您可以为每个表添加TIMESTAMP列,但不是必需的。