有关在Application_Start事件中实现SQL依赖关系的问题

时间:2014-08-28 12:45:35

标签: asp.net sql-server sqldependency

我通过i将调用SQL Dependency相关代码Application_Start事件,我的目标将完成。我的场景是我在我的Web应用程序中有一个例程,当我在sql server表中更新数据时,我只需单击一个按钮即可手动调用。我被告知要使这个过程自动化。

所以我浏览了几篇关于SQL Dependency的文章,通过我可以通过SQL依赖关系使我的手动过程自动化,因为我们可以通过SQL依赖关系监视表更改,SQL Dependency可以在完成更改时通知我们。

请参阅我的代码

protected void Application_Start(Object sender, EventArgs e)
        {
            System.Data.SqlClient.SqlDependency.Stop(connectionString);
            System.Data.SqlClient.SqlDependency.Start(connectionString);
            RegisterNotification();
        }
        static SqlDependency dep;
        private static void RegisterNotification()
        {
            string tmpdata = "";
            try
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    SqlCommand cmd = conn.CreateCommand();
                    cmd.CommandText = "SELECT ActivityDate FROM [bba-reman].ContentChangeLog";
                    dep = new SqlDependency(cmd);
                    dep.OnChange += new OnChangeEventHandler(OnDataChange);
                    SqlDataReader dr = cmd.ExecuteReader();
                    {
                        while (dr.Read())
                        {
                            if (dr[0] != DBNull.Value)
                            {
                                tmpdata = dr[0].ToString();
                            }
                        }
                    }

                    dr.Dispose();
                    cmd.Dispose();
                }
            }
            finally
            {
                //SqlDependency.Stop(connStr);
            }

        }

        static void OnDataChange(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency dep = sender as SqlDependency;
            dep.OnChange -= new OnChangeEventHandler(OnDataChange);
            SiteSearch.CreateIndex(false);
            RegisterNotification();
        }

        protected void Application_End(Object sender, EventArgs e)
        {
            System.Data.SqlClient.SqlDependency.Stop(connectionString);
        }

上面的代码运行正常,但我遇到了一个很好的问题。假设没有访问者访问我们的网站,同时如果有人通过win应用程序更改sql数据,那么我看到OnDataChange()事件未触发,但如果至少有一个访问者访问我们的网站,则{{1}事件正在正常发射。

可能这是asp.net引擎的默认属性。我可以在win服务或winform应用程序中使用SQL Dependency,但我有一些约束,因为检测到数据后我调用的例程在我们的Web应用程序中的db中发生了变化。

因此,如果没有访问者访问我们的网站,请指导我可以做的事情OnDataChange()事件应始终触发。

感谢

0 个答案:

没有答案