【问题标题】:run SqlTableDependency for update query as windows service作为 Windows 服务运行 SqlTableDependency 以进行更新查询
【发布时间】:2020-02-18 10:18:28
【问题描述】:

我开发了一个使用 SqlDependency 作为 Windows 服务的程序。但它不起作用。 我在 SQL 服务中有表 dbo.Product。我希望当此表的任何记录更新时,我会收到通知。

命名空间 MyService { 公共部分类Service1:ServiceBase { string connectionString = "数据源=.\myserver;初始目录=mydb;用户ID=用户;密码=pass;"; 静态 int itemref; 静态小数?数量; public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { RegisterNotification(); } private void RegisterNotification() { SqlConnection conn = new SqlConnection(connectionString); conn.Open(); using (SqlTableDependency<ItemStockSummary> tableDependency = new SqlTableDependency<ItemStockSummary>(connectionString)) { tableDependency.OnChanged += TableDependency_Changed; tableDependency.Start(); } } void TableDependency_Changed(object sender, RecordChangedEventArgs<ItemStockSummary> e) { if (e.ChangeType != ChangeType.None) { var changedEntity = e.Entity; itemref = changedEntity.ItemRef; quantity = changedEntity.Quantity; UpdateProduct(itemref, quantity); } } void OnDataChange(object sender, SqlNotificationEventArgs e) { ((SqlDependency)sender).OnChange -= OnDataChange; UpdateProduct(itemref, quantity); RegisterNotification(); } protected override void OnStop() { SqlDependency.Stop(connectionString); } public void UpdateProduct(int item, decimal? quantity) { \\Do something } }

【问题讨论】:

  • 您好,欢迎您。请通过提供您收到的任何错误消息的详细信息来帮助其他人回答您的问题。此外,您的代码格式有点偏离。查看格式指南 (stackoverflow.com/help/formatting)

标签: c# sql-update windows-services


【解决方案1】:

通过调用 using 语句,您实际上是在立即处理您的 sqlTableDependency 实例。

using (SqlTableDependency<ItemStockSummary> tableDependency = new SqlTableDependency<ItemStockSummary>(connectionString))
{
    tableDependency.OnChanged += TableDependency_Changed;
    tableDependency.Start();
}

您似乎每次都在尝试创建一个新连接,否则您会收到更新。 尝试通过以下方式保持连接:

SqlTableDependency<ItemStockSummary> tableDependency;

private void RegisterNotification()
{    
    tableDependency = new SqlTableDependency<ItemStockSummary>(connectionString))
    tableDependency.OnChanged += TableDependency_Changed;
    tableDependency.Start();
}

protected override void OnStop()
{
    tableDependency.OnChanged -= TableDependency_Changed;
    using (tableDependency) {}
}

这可能会在连接丢失等情况下失败,因此请尝试将其也转换为 SqlTableDependencyProvider 以进行自动重新连接。它是 SqlTableDependency 的包装器。 SqlTableDependency 不支持发生错误时自动重新连接。

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多