为什么没有触发SqlDependency.OnChange?

时间:2017-04-06 12:38:28

标签: c# .net sql-server signalr sqldependency

在过去3天遇到这个问题后,我终于把问题放到了这里。

我尝试使用SignalR和SqlDependency构建实时应用程序。显然,SQLDependency不起作用。但是,我的SignalR工作正常,因为我尝试了许多不需要数据库交互的函数。

以下是我的代码。 Here我正在参考。

的Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    NotificationHub objNotificationHub;

    protected void Application_Start()
    {
        string connectionString = WebConfigurationManager.AppSettings["SQL"];
        // SQL Command Text
        string commandText = "SELECT status From tableTask";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(commandText, connection);
            SqlDependency dependency = new SqlDependency(command);
            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);    
            SqlDependency.Start(connectionString);
            command.ExecuteReader().Dispose();
            objNotificationHub = new NotificationHub();
        }
    }

    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            objNotificationHub.SendNotifications();
        }
    }
}

NotificationHub.cs(SignalR Hub Class)

[HubMethodName("sendNotifications")]
public void SendNotifications()
{
    IHubContext context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
    context.Clients.All.recieveNotification("asbc");
}
  

我的SqlDependency.OnChange事件,即dependency_OnChange未触发   关于数据库更新。

我已经尝试了所有方法,例如授予权限

  

ALTER DATABASE MyDB SET ENABLE_BROKER

和许多其他人一样。 但没有成功。

我有什么遗失的东西吗?另外,有没有办法检查我的代码是否与SQL Server通信?

TIA

1 个答案:

答案 0 :(得分:2)

您没有执行命令,需要获取通知:

SqlDependency.Start(connectionString);
string commandText = "SELECT status From dbo.tableTask"; // don't forget schema here
using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    SqlDependency dependency = new SqlDependency(command);
    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);    
    command.ExecuteReader().Dispose();
    objNotificationHub = new NotificationHub();
}

确保您了解这些依赖项的工作原理(例如 - 在收到一个通知后 - 您需要重新注册才能获得后续通知)。或者更好的是,使用一些包装器库,如this一个。

您可以使用以下简单示例进行测试:

static void Main(string[] args) {
    var cs = "connection string";        
    using (SqlConnection connection = new SqlConnection(cs))
    {
        connection.Open();
        SqlCommand command = new SqlCommand("select ErrorCode from dbo.Error", connection);
        SqlDependency dependency = new SqlDependency(command);
        dependency.OnChange += OnChange;
        SqlDependency.Start(cs);
        command.ExecuteReader().Dispose();                
    }
    Console.ReadKey();
}

private static void OnChange(object sender, SqlNotificationEventArgs e) {
    Console.WriteLine(e.Info);
}