6

有谁知道从 .Net 应用程序监视 SQL Server(2005 或 2008)数据库中表记录更改的方法?它需要能够同时支持多个客户端。每个客户端将在启动时“订阅”,并在退出时“取消订阅”。多个用户可能同时访问系统,我想将他们的更改反映在其他用户的客户端上。然后,当客户端处理更改事件时,它可以更新表示该记录的本地对象。有点类似于 Access 更新被修改的记录如何反映在引用它的每个表单中。

我知道微软有用于与 SQL Server 交互的 Microsoft.SqlServer 库。但我不确定哪个概念适用于我想做的事情(或者什么可以适用于我想做的事情)。听起来可能有用的是管理或复制。

预料到有人会问,“为什么不偶尔重新查询表以查找新信息?” 我有大量的表要监控,这会让人头疼。另外,如果我正在寻找更优雅的东西。

我愿意接受建议...

4

5 回答 5

7

要在 SQL 2005+ 中监视对 SQL 表或记录的更改,您可以使用 SqlDependency 类。

它的目标是在 ASP.NET 或中间层服务中使用,其中单个服务器正在管理针对数据库的活动订阅,而不是由数百个客户端管理订阅。根据您所指的客户端的最大数量,您可能希望构建一个缓存池服务,该服务可以管理针对您的客户端的 SQL 通知订阅。

在它内部使用使用服务代理的 SqlNotificationRequest,而不是通知服务。因此,这应该适用于 SQL 2008 等。

SqlDependency 的 MSDN

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 缓存)类也可用于 Web 场景。

于 2009-05-21T21:35:29.370 回答
2

在 SQL Server 2008 中,您有更改跟踪,您可以在插入、更新或删除发生时进行跟踪。这将跟踪事件已经发生,它是哪条记录以及可选的哪些列被更改,但不是值(之前和之后)。这通常用于对已知的已更改数据执行批量处理。

在更改跟踪中,您可以设置保留期来保存更改,通常是确保跟踪表的任何处理都在保留期内的时间段。

或者,您有(同样,在 SQL 2008 中)更改数据捕获,它更细化并记录实际更改。但是,这只是企业功能。

您可以轻松创建 .NET 应用程序来运行更改跟踪更改数据捕获 查询。

这是有关两者的更多信息的链接

更改跟踪

变更数据捕获

在大多数情况下,更改跟踪可能是最好的选择——而且它适用于所有版本的 SQL Server 2008。

如果您想在 2005 年或以下实现这一目标,您基本上可以为要跟踪的每个表创建表,并在插入、更新、删除时将值插入到跟踪表中。然后有一个过程来清除它。这基本上就是变更跟踪为您所做的。

于 2008-12-05T09:03:21.280 回答
0

我想我误读了这个问题。

听起来这是一个带有锁定控制的标准多用户应用程序。用户登录然后访问服务器上的数据(订阅)。用户注销(取消订阅)。

或者这是您想要同步更改的断开连接的应用程序?

对于断开连接的应用程序,您可以使用 SQL Server 的同步服务。

除此之外,只需使用 LINQ to Entities,您就可以在保存对象更改时处理冲突。为确保 LINQ 生成的查询是高性能的,您可以向每个表添加一个 TIMESTAMP 列,但这不是必需的。

于 2008-12-05T11:57:14.487 回答
0

我没有亲自使用过,但听起来Notification Services值得一看

更多这里...

于 2008-12-04T21:12:07.143 回答
0

这种情况通常不能很好地扩展......您可以查看 SQL 通知服务,但这也有同样的问题。

在一个系统中,我通过使用触发器来编写对(单个)增量表的更改的简短摘要,包括表、更改类型和行 ID。每个客户端都维护一个“我读过的地方”,并简单地询问所有 id > 这个数字的增量记录。问题是你需要做一些聪明的事情来清理表格而不破坏任何单个客户端的更改历史......即跟踪注销,假设他们在给定的时间之后已经死亡,并在他们完全刷新时记录。

绝对可行,但工作量很大。

于 2008-12-04T21:14:31.493 回答