有什么方法可以对Azure SQL数据库的更改做出反应?

时间:2019-03-25 12:52:35

标签: c# asp.net azure signalr azure-sql-database

我在应用程序中使用SignalR,并对使用Sql Dependency的数据库更改做出反应

SqlDependency.Start(con);

但是我遇到以下错误:

此版本的SQL Server不支持语句'RECEIVE MSG'

据我所知,Azure SQL数据库不支持Service Broker。

除了迁移到Azure VM之外,还有其他解决方案吗?

具有SQL依赖关系的代码示例:

public class NotificationComponent
{
    public void RegisterNotification(DateTime currentTime)
    {
        string conStr = ConfigurationManager.ConnectionStrings["sqlConString"].ConnectionString;
        string sqlCommand = @"SELECT [ContactID],[ContactName],[ContactNo] from [dbo].[Contacts] where [AddedOn] > @AddedOn";
        using (SqlConnection con = new SqlConnection(conStr))
        {
            SqlCommand cmd = new SqlCommand(sqlCommand, con);
            cmd.Parameters.AddWithValue("@AddedOn", currentTime);
            if (con.State != System.Data.ConnectionState.Open)
            {
                con.Open();
            }
            cmd.Notification = null;
            SqlDependency sqlDep = new SqlDependency(cmd);
            sqlDep.OnChange += sqlDep_OnChange;
            using (SqlDataReader reader = cmd.ExecuteReader())
            {

            }
        }
    }

    void sqlDep_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            SqlDependency sqlDep = sender as SqlDependency;
            sqlDep.OnChange -= sqlDep_OnChange;

            var notificationHub = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
            notificationHub.Clients.All.notify("added");
            RegisterNotification(DateTime.Now);
        }
    }

    public List<Contact> GetContacts(DateTime afterDate)
    {
        using (MyPushNotificationEntities dc = new MyPushNotificationEntities())
        {
            return dc.Contacts.Where(a => a.AddedOn > afterDate).OrderByDescending(a => a.AddedOn).ToList();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用“创建项目时”和“修改项目时”触发Azure Logic App中的SQL对数据更改做出反应。

Azure Logic Apps中的SQL连接器使用轮询机制通过TIMESTAMP / ROWVERSION列查询表中的更改。该数据类型是专门为SQL中的这种处理而设计的。轮询查询从本质上选择rowversion大于上一个轮询值的所有行。该行为是可靠的,因为该列由SQL Server控制,并且在没有新数据的情况下,其性能非常快。当有新数据时,其性能可与简单的行查询相媲美。

有关更多信息,请阅读this文章。