-->

从的SqlDependency获取数据(Getting data from SqlDependenc

2019-07-19 21:58发布

我有一个表,并正在等待新插入一个的SqlDependency。

的OnChange火灾,因为我需要的,但如果有可能得到这导致DATABSE变化的行我不明白。

的SqlDependency SQL命令:

SqlCommand cmd = new SqlCommand("SELECT id FROM dbo.DataRequests", m_sqlConn);

的OnChange代码:

private void OnChange(object sender, SqlNotificationEventArgs e)
{
    SqlDependency dependency = sender as SqlDependency;

    dependency.OnChange -= OnChange;

    Console.WriteLine("Info:   " + e.Info.ToString());
    Console.WriteLine("Source: " + e.Source.ToString());
    Console.WriteLine("Type:   " + e.Type.ToString());


    Console.WriteLine(DateTime.Now);

    GetMessages();

}

Answer 1:

没有任何资料关于导致依赖性被解雇的行。

我想作为一个变通方法,您可以始终把时间戳在您的记录和跟踪事件时,最后被解雇。



Answer 2:

看看这个组件: SqlTableDependency

有关SQL Server数据库表中所做的每一变化,C#代码接收包含更改的记录列表的事件。



Answer 3:

根据这篇文章,你不能: http://social.msdn.microsoft.com/Forums/en-US/sqlservicebroker/thread/07234067-73e1-4db5-a4e6-0f9f0bae22ae/

您只能通过使用属性缩小为通知的原因

  • 资源
  • 类型
  • 信息

所提供的SqlNotificationEventArgs



Answer 4:

找到一个很巧妙的解决方案在这里



Answer 5:

只需使用一个跨平台的.NET 3.5的兼容和开放源码SqlDependencyEx 。 它使用一个数据库触发器和本地服务代理通知接收关于表的更改事件。 这是一个使用示例:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

你可以得到变更通知,以及其被改变的信息。 请按照以下链接了解详情。



Answer 6:

我希望这可以帮助你:

     string commandString = string.Format("SELECT [Id] FROM [dbo].[Tech]");
     command = new SqlCommand(commandString, connection);

    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        SqlDependency dependency = (SqlDependency)sender;
        dependency.OnChange -= dependency_OnChange;

        this.Dispatcher.Invoke((System.Action)(() =>
        {

            if (e.Info.ToString().ToLower().Trim() == "insert")
            {
                GetData();
                int NewTechID = TechIDs.Last();
            }

        }));
    }

    private void GetData()
    {
        command.Notification = null;
        SqlDependency dependency = new SqlDependency(command);
        dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

        command.Connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                TechIDs.add(int.Parse(reader.GetValue(0).ToString()));
            }
            reader.Close();
        }
        command.Connection.Close();
    }


Answer 7:

您可以使用临时表。 首先你需要创建一个临时表,你需要保持在调查的所有字段。 就像是:

CREATE TABLE ##TempTab(
    [field1] [varchar](50) NULL,
    [field2] [varchar](50) NULL
}

请注意,这类外部COSE内创建的表自动被删除,因为创作者程序退出,所以你不需要砸的FormClosing ...现在,建立sqlDepency充塞你必须填写你的临时表后,它的东西像起始场景的快照。 然后,每一个onChange事件被触发时,你只需要您的临时表更新情况进行比较。 它可能是这样的:

    select * from ##temptable left outer join mytable
ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2
WHERE myTable.field2 is null

这会给你的所有行刚刚被删除(或旧值chagend)。 另一方面:

select * from mytable left outer join ##temptable
    ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2
    WHERE ##temptable.field2 is null

会给你所有行刚刚被添加(或用新值改变)。 在此之后进行比较,你只需要使用新值更新您的临时表(更快的方法是删除一切,然后增加值)。当然,如果你的PROGRAMM将被不同的用户同时运行,你需要临时表内处理用户标识。



文章来源: Getting data from SqlDependency