sqldependency

时间:2015-05-07 15:10:00

标签: c# signalr sqldependency

我有一个包含聊天信息的mssql表。它具有计算列,具有数百万行,并由第三方应用程序使用/填充。现在我想使用此表在我的网站上显示聊天记录,并且将来有可能使用signalr发送消息。 我使用sqldependency进行了几次测试,它只能用于我的情况下无法帮助的特定查询(我必须排除计算列,不能按最后一次msg排序,不能设置前100条消息等)

所以我的问题是什么呢?使用每x秒轮询数据库的Web服务?

旁注,我根本没有影响桌子。

2 个答案:

答案 0 :(得分:6)

如果您对实际需求有更多了解,我认为您仍然可以使用SqlDependency

您用来检测更改的查询不一定与用于获取更改的查询相同。你可以拥有

select id from chat where chatRoomId = 123

作为"检测更改查询"。这只会告诉你"有一条新消息。或者更多。",没有别的。然后,要获取实际的新行,您可以使用复杂的查询:

select 
 top 100 someComplexColumn, everythingElse 
from chat 
where chatRoomId = 123 
order by messageTime desc

只要"检测更改查询"足以将你不关心的大部分变化与你关心的变化分开,你很好。请注意,SqlDependency实际上并未告诉您 更改了什么,或其他任何有关数据的信息。它并不关心有多少数据适合查询现在 - 它只跟踪适合您指定的过滤器的更改。由于聊天消息通常是不可变的,因此您只需检查id列即可(例如"新项目")。如果您的聊天消息是可编辑的,那么您还必须在您的"检测更改查询"中添加一些changedOn列。

答案 1 :(得分:2)

SqlDependency的一个不错的选择是SqlDependencyEx。它没有内存泄漏problems并使用数据库触发器和本机Service Broker通知来接收有关表更改的事件。这是一个用法示例:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

使用SqlDependecyEx,您可以分别监控INSERTDELETEUPDATE,并在事件args对象中接收实际更改的数据(xml)。过滤传入的消息可帮助您实现所需的行为。希望这有帮助。