在过去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
答案 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);
}