【问题标题】:sqldependency not detecting change. What am I missing?sqldependency 未检测到更改。我错过了什么?
【发布时间】:2015-01-05 09:39:40
【问题描述】:

我正在尝试使用 sqldependency 检查任何数据库更改,然后向连接到信号器的客户端发送一些内容。问题是,它似乎没有检测到变化。我觉得少了点什么。代码如下:

[HubName("DataHub")]
public class DataHub : Hub
{
    public void pushOnChange() 
    {
        string connection = "data source=fourthD;initial catalog=dash;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"";
        SqlDependency.Start(connection);
        SqlConnection connectionString = new SqlConnection(connection);
        connectionString.Open();

        using (SqlCommand command=new SqlCommand("SELECT * FROM dbo.insight", connectionString))
        {
            command.Notification = null;
            SqlDependency dependency = new SqlDependency(command);
            dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
            command.ExecuteReader();
        }
    }


    void OnDependencyChange(object sender, SqlNotificationEventArgs e)
    {
        Dictionary<string, string> data = new Dictionary<string, string> { };
        data.Add("Id","34");
        data.Add("DeviceId", "163-117")
        data.Add("DeviceUserName", "Someone");

        var result = new[] { data };

        Clients.All.addData(result);
    }
}

【问题讨论】:

  • 也许你应该先读点东西?
  • 此外,正确缩进代码通常被视为一种特征。缩进不正确的代码是不可读的。
  • 对不起代码..有什么解决办法吗?
  • SqlDependecy 是否像 Web 应用程序一样在“断开连接”的环境中工作?我希望它只能在 Winform 应用程序中工作,你有一个不断运行的应用程序。
  • 这段代码似乎是无操作的或非常种族的。如果客户端调用pushOnChange(),您创建一个新的SqlDependency 实例,然后您ExecuteReader 并在dependency 超出范围之后立即取消订阅事件处理程序。我认为依赖项通知发生在不同的线程上,并且(仅仅因为它使用了 db)需要一些时间来执行,所以在 dependency 实例存在时您不太可能(几乎不可能)收到通知。

标签: c# sql .net signalr sqldependency


【解决方案1】:

问题是SqlDependency 需要重新订阅。所以,你应该像这样修改你的 OnDependencyChange 方法:

void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
    // Resubscription
    using (SqlCommand command=new SqlCommand("SELECT * FROM dbo.insight"
            , connectionString))
    {
        command.Notification = null;
        SqlDependency dependency = new SqlDependency(command);
        dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
        command.ExecuteReader();
    }

    Dictionary<string, string> data = new Dictionary<string, string> { };
    data.Add("Id","34");
    data.Add("DeviceId", "163-117")
    data.Add("DeviceUserName", "Someone");

    var result = new[] { data };

    Clients.All.addData(result);
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多