SqlTableDependency onchange事件未触发

时间:2016-12-15 16:39:05

标签: c# sql sql-server sqldependency

我遇到了SqlTableDependency的问题。当我对欲望表进行插入/更新/删除时,不会调用My Changed方法。 OnStatusChanged事件正常。

 string conn = @"data source=secret server; integrated security=True; initial catalog=secret db;User id=secret user";

    var mapper = new ModelToTableMapper<SqlDataModel>();

    mapper.AddMapping(c => c.datavalue, "datavalue");       

    using (var dep = new SqlTableDependency<SqlDataModel>(conn, "data", mapper))
    {
        dep.OnChanged +=  Changed;
        dep.OnStatusChanged += OnStatusChanged;
        dep.OnError += OnError;
        dep.TraceLevel = TraceLevel.Verbose;
        dep.TraceListener = new TextWriterTraceListener(Console.Out);            
        dep.Start();          

        Console.WriteLine("Press a key to exit");           
        Console.ReadKey();            
        dep.Stop();
    }
}
static void OnStatusChanged(object sender, StatusChangedEventArgs e)
{
    Console.WriteLine(e.ToString());
}
static void OnError(object sender, ErrorEventArgs e)
{
    Console.WriteLine(e.ToString());
}
static void Changed(object sender, RecordChangedEventArgs<SqlDataModel> e)
{      
    if (e.ChangeType != ChangeType.None)
    {
        var changedEntity = e.Entity;
        Console.WriteLine("DML operation: " + e.ChangeType);          
        Console.WriteLine("value: " + changedEntity.datavalue);
    }
}

以上代码我基于https://tabledependency.codeplex.com/wikipage?title=SqlTableDependency 我确信我有,我正在使用db_owner角色。我启用了代理,我看到在mssql db中创建了trigers,services等。

enter image description here

2 个答案:

答案 0 :(得分:6)

我在sys.transmission_queue表中最终发现错误: 在目标队列中排队消息时发生异常。错误:

  

15517,状态:1。无法作为数据库主体执行,因为   校长“dbo”不存在,这种类型的校长不可能   冒充,或者你没有得到许可。

即使数据库已经给了我完全的许可,我还没有做到

ALTER AUTHORIZATION ON DATABASE::secret db TO sa

答案 1 :(得分:1)

还请检查“关于跟踪记录更改的兼容性级别和数据库版本的说明”部分,https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency

  

即使您的SQL Server实例是SQL Server 2008 R2或最新版本,也可能是您的数据库是使用旧版SQL Server创建的,例如SQL Server 2005。