有谁知道从 .Net 应用程序监视 SQL Server(2005 或 2008)数据库中表记录更改的方法?它需要能够同时支持多个客户端。每个客户端在启动时都会“订阅”,退出时会“取消订阅”。多个用户可以同时访问系统,我想在其他用户客户端上反射(reflect)他们的更改。然后,当客户端处理更改事件时,它可以更新代表该记录的本地对象。有点类似于 Access 更新被修改的记录如何反射(reflect)在引用它的每个表单中。
我知道微软有用于与 SQL Server 交互的 Microsoft.SqlServer 库。但我不确定哪个概念适用于我想做的事情(或者哪些概念可以适用于我想做的事情)。听起来可能有用的是管理类或复制类。
预料到有人会问,“为什么不偶尔重新查询表以查找新信息?”我有大量要监控的表,这会很麻烦。另外,如果我正在寻找更优雅的东西。
我愿意接受建议...
最佳答案
要在 SQL 2005+ 中监控 SQL 表或记录的更改,您可以使用 SqlDependency 类。
它的目标是在 ASP.NET 或中间层服务中使用,其中单个服务器管理针对数据库的事件订阅 - 而不是数百个管理订阅的客户端。根据您所指的最大客户端数量,您可能希望构建一个缓存池服务,该服务可以管理针对您的客户端的 SQL 通知订阅。
在它内部使用 SqlNotificationRequest,它使用 Service Broker,而不是 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”文章介绍了在您的代码中设置它的步骤(以网络应用为例)以及订阅 Service Broker 所需的适当 SQL 权限等。
安ASP.NET (web caching)类也可用于 Web 场景。
关于.Net SQL Server 数据库监控 - 插入、更新、删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/342031/