当数据库中的数据发生更改时,在c#中更新数据绑定数据源

时间:2009-11-19 09:27:42

标签: wpf data-binding notifications

我之前发过一篇类似的帖子,但从那以后我做了一些研究,并认为我会再把这个问题拿出来看看是否有人对我的问题有任何想法。

我正在使用C#作为代码beind运行WPF应用程序。我使用的数据库是SQL Server 2005。

现在我正在使用ADO.Net绑定到数据库,并从db中的存储过程中检索数据。然后将其存储在数据集中,并进一步向下绑定到我的WPF应用程序中的控件。

现在,我在数据库中绑定的数据不断变化,比如每隔几秒就会发生变化。我想要的是一种机制,可以在C#中自动告诉我当我绑定到数据库中的数据时,从我的存储过程中返回的数据已经改变。

我查看了网络并找到了通知服务和SQLDependency类,但这已被弃用。我也看过CLINQ,但这似乎没有处理数据库通知方面,它只适用于我理解的c#中的集合。

我的意思是计划B方法是在我的C#代码中只有一个线程,根据存储在返回数据集中每一行的时间戳,每隔几秒轮询同一个存储过程。如果我当前的时间戳大于返回的内容,则检索该数据。然后,这将在这个新的线程中反复循环。如果从线程中的连接返回任何数据,这意味着数据已经更改,因此将数据存储到c#中的集合中,以便它们可以绑定到我的WPF应用程序。

显然这是我真的不想做的事情,因为我认为可能有更聪明的方法来做到这一点,但我似乎无法找到任何事情。

有没有人对此有任何想法?

非常感谢 伊菲。

2 个答案:

答案 0 :(得分:0)

SQL CLR触发器怎么样?每次在数据库中的目标表中发生更新/插入/删除时,都可以运行SQL触发器,似乎CLR SQL触发器将此功能扩展到托管代码:

http://msdn.microsoft.com/en-us/library/938d9dz2(VS.80).aspx

不是这方面的专家,但希望它会给你一些有用的东西。

答案 1 :(得分:0)

Plan B听起来对我来说是一个不错的选择 - SQL Server没有内置的通知方法允许你这样做,所以你唯一的选择就是:

  1. 触发器与CLR用户定义的函数相结合。问题在于,根据您在用户定义的函数中执行的工作量,这可能会为写入数据库的任何人增加相当多的开销 - 这不是实现通知机制的最有效层。
    • 实施某种通知机制,并确保写入数据库的每个人都使用此通知机制通知其他人数据已更改。
  2. 考虑到#2的努力程度,我会说计划B是一个不错的选择。

    根据您轮询的频率和轮询的效率,您可能会发现用户的最终效果无论如何都与选项#2一样好,并且执行该轮询的开销可能比您想象的要少。 。 (如果你有很多用户,那么你可以使用缓存等技术/常见的轮询线程来帮忙)