从 Sql 服务器获取通知

Getting notification from Sql Server

我想在我的 winforms 应用程序中使用 SqlDependency class :

    public partial class Form1 : Form
    {
        private int changeCount = 0; 
        private const string statusMessage = "{0} changes have occurred."; 

        private static SqlConnection connection = null;
        private static SqlCommand command = null;
        private static SqlDependency dependency;

        private static SqlCommand command1 = null;
        private static SqlDependency dependency1;

        public Form1()
        {
            InitializeComponent();
            button1.Enabled = CanRequestNotifications();
            this.FormClosed += Form1_FormClosed;
            if (connection == null)
            {
                connection = new SqlConnection(GetConnectionString());
            }

            if (command == null)
            {
                command = new SqlCommand("procCreationUser", connection);
                command.CommandType = CommandType.StoredProcedure;
            }
            dependency = new SqlDependency(command);

            if (connection == null)
            {
                connection = new SqlConnection(GetConnectionString());
            }

            if (command1 == null)
            {
                command1 = new SqlCommand("procSelectionUser", connection);
                command1.CommandType = CommandType.StoredProcedure;
            }
            dependency1 = new SqlDependency(command1);
            GetData();
        }

        private void GetData()
        {

            SqlDependency.Start(GetConnectionString());
            if (connection.State != ConnectionState.Open) connection.Open();
            using (var dr = command.ExecuteReader())
            {
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
            }

            using (var dr = command1.ExecuteReader())
            {
                dependency1.OnChange += new OnChangeEventHandler(dependency_OnChange);
            }

        }
        private string GetConnectionString()
        {
            return @"Data Source=PRT-12\SQLEXPRESS; Initial Catalog=TestNotification;Integrated Security=True";
        }


        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            MessageBox.Show("Notification");      
        }

    } 

我创建了两个存储过程:procCreationUser 用于创建,procSelectionUser 用于 select 用户。

当我启动应用程序并单击按钮并在数据库中插入新行时,我没有收到任何通知!!!!!

  1. 如何修复我的代码?
  2. 这是从 Sql 服务器获取通知的最佳方式吗?

通常您应该先订阅活动 dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);,然后您才会收到来自 command.ExecuteReader() 的更新。
对于两个单独的命令,最好有两个单独的 SqlDependency.

我推荐你阅读这些:

您需要确定以下事件全部发生:

  • 您的查询创建了一个通知订阅。检查上面文章中提到的Profiler事件,检查sys.dm_qn_subscriptions
  • 检查修改数据是否使订阅无效,使用上面文章中提到的 Profiler 事件
  • 检查通知消息是否送达,特别检查 sys.transmission_queue
  • 中的 transmission_status
  • 检查您的代码是否已成功设置通知侦听器。您的应用 必须 在应用域关闭时调用 SqlDependency.Start once per appdomain and ideally should call SqlDependency.Stop

收到通知后,请确保检查并遵守 SqlNotificationEventArgs 参数中的 SourceInfoType。并非所有组合都表示成功,通知也可能会立即触发,表明您的订阅有问题。

此外,您的代码还有一些小花絮:

  • 您需要在 执行查询之前连接 SqlDependency :

    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 使用 (var dr = command.ExecuteReader()) { 而 (dr.Read()) { ... } }

  • 您需要为每个应用程序域SqlDependency.Start调用一次。在显示 Form

  • 之前尝试在 Main 中调用它