根据SQL Server列或行更新,将数据传输到特定页面上的客户端

时间:2012-05-13 23:44:18

标签: asp.net http iis sql-server-2012

我想使用ASP.NET和SQL Server实现特定的功能。例如,我有几个页面,每个页面都有自己的标识(即id = 1,id = 5)。此外,让我们假设对于每个id,我在数据库中有一行:

简而言之,我想要实现的目标是:在利用Web套接字(持久连接)的同时,将数据库更改直接推送到特定页面上的特定客户端。

例如:

第1行:

id = 1

name = myname1

第2行:

id = 2

name = myname2

我想要做的是,当列中的特定行甚至特定值发生更改时,它将触发一个事件,该事件只能将特定数据发送到正在访问具有特定ID的页面的客户端。改变。

例如:如果第1行列名从'name1'更改为'name2',并且主键的ID为5,我希望所有访问id = 5的页面的人都在客户端接收事件侧。

我想阻止自己开发一个客户端代码,该代码会有争议地将请求发送到Web服务并通过id查询该特定行,以查看它是更新还是特定列值已更改。

我想到的一个解决方案是将密钥/值保存在内存中(即memcache),就像密钥代表id一样,值将是更新的datetime lst。然后我可以查询内存,例如,[5,05 / 11/2012 12:03:45]我可以通过保存上次查询客户端内存中的内容来了解​​他们的数据是否上次更新了,比较日期。如果客户端日期时间值早于内存中键/值中的值,那么我将再次查询数据库。

然而,它仍然是一种被动的方式。

让我画出它应该如何运作:

  1. 客户端和服务器具有持久连接 [可以使用ASP.NET 4.5套接字协议完成]

  2. 服务器知道区分来自不同页面的连接,具有不同查询字符串的连接,例如id = 1,id = 2等。我想到的一个选项是在内存中创建一个数组存储每个连接字符串id值的连接ID。例如:{1:2346,6767,87878,2:876,8765,3455}。 1和2是页面的标识(即id = 1,id = 2),其他值是我使用ASP.net 4.5获得的持久连接的连接ID

  3. 主键值为id = 5的行中的列值使其“count”列从值“1”更新为“2”。

  4. 触发器调用一个函数并传递已更改行的id(让我们假设值X)。我更喜欢能够发送特定列的值(我选择的某些列) [这是使用CLR触发器完成的]

  5. 该函数有一个连接列表,用于访问id为值X(数字)的页面的客户

  6. 服务器向客户端发送列值,或者如果不可能,则发送true或false,通知客户端已对该行进行了更改。

  7. 解决至今:

    1]可以使用ASP.NET 4.5套接字协议来完成

    4]使用CLR触发器,我可以使用一个函数来获取已更改的特定行的列数据和id。

    我正在使用ASP.NET 4.5开发我的应用程序。

    由于

1 个答案:

答案 0 :(得分:1)

Sql Server Service Broker可以满足您的大部分需求。

Service Broker允许在sql server中进行异步消息传递。由于它是异步的,我们将功能分为两部分。

第一部分是表上的触发器,它将消息写入服务代理队列。这只是直接的T-SQL,而且相当直接。消息的有效负载是您可以转换为varbinary(max)的任何内容。它可以是xml,包含逗号分隔值的varchar(100)或其他一些表示。

第二部分是消息的处理。您发出transact-sql RECEIVE语句以从队列中获取下一条消息。这个陈述阻止,直到有东西到来。队列可以有多个会话,因此每个客户端都会收到自己的通知。

从概念上讲,它可以像这样工作(客户端是asp.net代码):

  1. 客户端打开Service Broker对话。
  2. 客户端发送一条消息,上面写着“我对Page = 3感兴趣”
  3. 客户端执行无限期阻止的RECEIVE
  4. UPDATE更改page = 3
  5. 的数据
  6. 表上的触发器向每个对Page = 3
  7. 感兴趣的会话发送消息
  8. 客户端收到消息,并将更新的数据发送到Web浏览器。
  9. 不需要CLR,不定期轮询数据库。