0

我正在尝试使用 LINQ 获取 SQL 依赖项通知。

我使用硬编码的命令文本成功:

   using (SqlConnection conn = new SqlConnection(ConnStr))
    {
        conn.Open();

        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = "SELECT [t0].[discounttype] FROM [dbo].[discounts] AS [t0]";

        var dep = new SqlDependency(cmd);
        dep.OnChange += OnDataChange;

        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read()) { Console.WriteLine("Name = " + dr[0]); }
        }
    }

我看到QN: SubscriptionSQL Server Profiler 中列出了一个事件,其文本包括subscription registered. discounts之后的一切都很好 - 当对表格进行更改时,我会收到通知。

但是,如果我使用 LINQ 尝试相同的查询:

    using (TestNotifyDataContext dc = new TestNotifyDataContext(ConnStr))
    {
        var results = from d in dc.Discounts select d;

        SqlCommand cmd = (SqlCommand) dc.GetCommand(results);

        var dep = new SqlDependency(cmd);
        dep.OnChange += OnDataChange;

        List<Discount> table = results.ToList();

        foreach (var discount in table)
        {
            Console.WriteLine("L: " + discount.discounttype);
        }
    }

results正确返回,但 Profiler 中没有QN: Subscription事件(因此我不会收到更改通知)。根据http://www.simple-talk.com/sql/t-sql-programming/using-and-monitoring-sql-2005-query-notification/如果订阅注册失败,应该有一个不同文本的条目但甚至没有,所以似乎服务器甚至没有收到请求。

请谁能告诉我我做错了什么或指出我正确的方向。

4

1 回答 1

1

我猜这是因为创建了两个单独的 SqlCommand 对象,一个在 dc.GetCommand(results) 中,一个在 results.ToList(); 所以,实际执行的 SqlCommand 对象并没有与 SqlDependency 对象相关联。

尝试 cmd.ExecuteReader 并查看依赖项是否已注册。

于 2011-04-16T17:29:58.940 回答