0

SQL依存関係通知をLINQで機能させようとしています。

ハードコードされたコマンドテキストで成功しました:

   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: SubscriptionSQLServerプロファイラーに。を含むテキストでリストされたイベントが表示されます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は正しく返さQN: Subscriptionれますが、プロファイラーにはイベントがありません(したがって、変更に関する通知は届きません)。http://www.simple-talk.com/sql/t-sql-programming/using-and-monitoring-sql-2005-query-notification/によると、サブスクリプションの登録に失敗した場合は、異なるテキストのエントリが必要です。しかし、それすらないので、サーバーがリクエストを受信して​​いないようです。

誰かが私が間違ったことを教えてくれるか、正しい方向に私を向けてください。

4

1 に答える 1

1

これは、2つの別々のSqlCommandオブジェクトが作成されているためだと思います。1つはdc.GetCommand(results)にあり、もう1つはresults.ToList()にあります。したがって、実際に実行されたSqlCommandオブジェクトは、SqlDependencyオブジェクトに関連付けられていません。

cmd.ExecuteReaderを試して、依存関係が登録されているかどうかを確認してください。

于 2011-04-16T17:29:58.940 に答える