检测SQL数据库更改

时间:2014-09-04 16:07:10

标签: c# sql listener service-broker sqldependency

考虑这个例子:

INSERT INTO [Table] (column1)
SELECT value1

如果我要在SSMS中执行此命令,关于c#表单应用程序,为了识别此事件,我需要做什么?这个事件发生时显示MessageBox的应用程序这么简单。我似乎无法解决这个问题或者找到任何有用的数据。我试图使用SqlDependency,但没有运气。如果这是我需要走的道路,那么任何人都可以帮助我更好地理解这个概念吗?

1 个答案:

答案 0 :(得分:8)

如果您想检测更改而不仅仅是插入,则可以使用SQL Dependency来实现此目的。您是否已阅读并尝试过链接中的示例?

Heres a nice 'tutorial / example' that works and runs you through the basics

Heres a nice overview of Query Notifications.

  • SqlNotificationRequest类提供了低级实现,它公开了服务器端功能,使您能够执行带有通知请求的命令。

  • 高级实现由SqlDependency类提供,该类是一个在源应用程序和SQL Server之间提供通知功能的高级抽象的类,使您可以使用依赖项来检测服务器。在大多数情况下,这是使用.NET Framework数据提供程序为SQL Server利用受管客户端应用程序利用SQL Server通知功能的最简单,最有效的方法。

  • 此外,使用ASP.NET 2.0或更高版本构建的Web应用程序可以使用SqlCacheDependency帮助程序类。

它与&#34基本相同; SqlDependency对象可以与SqlCommand关联,以便检测查询结果何时与最初检索的结果不同。"

您必须先Enable Query Notifications并关注Creating a Query for Notification

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
    // Assume connection is an open SqlConnection.
    // Create a new SqlCommand object which directly references (no synonyms) the data you want to check for changes.
    using (SqlCommand command=new SqlCommand("SELECT value1 FROM [Table]", 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.
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // Process the DataReader.
        }
    }
}

// Handler method
void OnDependencyChange(object sender, SqlNotificationEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}

void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}