0

レコードのサブセットを返す必要があり、そのために次のコマンドを使用します。

using (SqlCommand command = new SqlCommand(
                    "SELECT ID, Name, Flag, IsDefault FROM (SELECT ROW_NUMBER() OVER (ORDER BY @OrderBy DESC) as Row, ID, Name, Flag, IsDefault FROM dbo.Languages) results WHERE Row BETWEEN ((@Page - 1) * @ItemsPerPage + 1) AND (@Page * @ItemsPerPage)",
                    connection))

次のように宣言されたSqlCacheDependencyを設定します。

SqlCacheDependency cacheDependency = new SqlCacheDependency(command);

しかし、command.ExecuteReader()命令を実行した直後に、クエリの結果をまったく変更しなかったにもかかわらず、SqlCacheDependencyオブジェクトのhasChanged基本プロパティがtrueになります。また、このため、このクエリの結果はキャッシュに保持されません。

HttpRuntime.Cache.Insert( cacheKey, list, cacheDependency, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(AppConfiguration.CacheExpiration.VeryLowActivity));

コマンドに2つのSELECTステートメントがあるためですか?ROW_NUMBER()ですか?はいの場合、結果をページ分割する他の方法はありますか?

助けてください!時間がかかりすぎると、少しでも大歓迎です!ありがとうございました

4

3 に答える 3

1

推測ですが、ステートメントに句SELECTがないことが原因である可能性がありますか?ORDER BY

明示的な順序を指定しない場合、クエリが実行されるたびに、クエリが任意の順序で結果を返す可能性があります。これにより、SqlCacheDependencyオブジェクトは結果が変更されたと見なしている可能性があります。

ORDER BY句を追加してみてください:

SELECT ID, Name, Flag, IsDefault
FROM
(
    SELECT ROW_NUMBER() OVER (ORDER BY @OrderBy DESC) AS Row,
        ID, Name, Flag, IsDefault
    FROM dbo.Languages
) AS results
WHERE Row BETWEEN ((@Page - 1) * @ItemsPerPage + 1) AND (@Page * @ItemsPerPage)
ORDER BY Row
于 2009-10-08T23:17:03.767 に答える
1

私はSqlCacheDependencyの専門家ではありません。実際、私自身の問題に対する答えを探しているときに、この質問を見つけました。ただし、SqlCacheDependencyが機能しない理由は、SQLにネストされたサブクエリが含まれているためだと思います。

SQLで使用できる/使用できないものをリストしたドキュメントを見てください:通知用のクエリの作成

「....ステートメントには、サブクエリ、外部結合、または自己結合を含めることはできません.....」

また、Redgateの人からの貴重なトラブルシューティング情報をここで見つけました:自分の問題を解決するのに役立つSQL 2005クエリ通知の使用と監視:SQLプロファイラーを使用して彼が提案するQNイベントを追跡することで、接続が正しくないことを見つけることができました'SET ARITHABORT OFF'オプションを使用すると、通知が失敗します。

于 2010-03-22T13:02:34.193 に答える
1

同じ問題に遭遇し、助けを借りずにオンラインで同じ答えを見つけたとき、私はプロファイラーからのxmlの無効なサブスクリプション応答を調査していました。

msdnサポートサイトで、コードの順序が少し異なる例を見つけました。試してみると、問題が発生しました。コマンドオブジェクトとキャッシュ依存関係オブジェクトを作成するまで、接続オブジェクトを開かないでください。これがあなたが従わなければならない順序であり、すべてがうまくいくでしょう:

  1. 必ず通知(SqlCahceDependencyAdmin)を有効にして、SqlDependency.Startを最初に実行してください
  2. 接続オブジェクトを作成します
  3. コマンドオブジェクトを作成し、コマンドテキスト、タイプ、および接続オブジェクト(コンストラクターの任意の組み合わせ、プロパティの設定、またはCreateCommandの使用)を割り当てます。
  4. SQLキャッシュ依存関係オブジェクトを作成します
  5. 接続オブジェクトを開きます
  6. クエリを実行します
  7. 依存関係を使用してアイテムをキャッシュに追加します。

この順序に従い、selectステートメントの他のすべての要件に従う場合、権限の問題はありません。これで機能します。

この問題は、.NET Frameworkが接続を管理する方法、具体的にはどの設定が設定されているかに関係していると思います。sqlコマンドテストでこれをオーバーライドしようとしましたが、機能しませんでした。これは単なる推測です-私が知っていることは、順序を変更するとすぐに問題が解決したことです。

以下からmsdnの投稿までつなぎ合わせることができました。

この投稿は、無効なサブスクリプションの最も一般的な原因の1つであり、.Netクライアントが通知に必要なものとは対照的なプロパティを設定する方法を示しています。

https://social.msdn.microsoft.com/Forums/en-US/cf3853f3-0ea1-41b9-987e-9922e5766066/changing-default-set-options-forced-by-net?forum=adodotnetdataproviders

次に、この投稿は、私のように、コードを最も単純な形式に縮小したユーザーからのものでした。私の元のコードパターンは彼と似ていました。

https://social.technet.microsoft.com/Forums/windows/en-US/5a29d49b-8c2c-4fe8-b8de-d632a3f60f68/subscriptions-always-invalid-usual-suspects-checked-no-joy?forum=sqlservicebroker

それから私はこの投稿を見つけました、これも問題の非常に単純な削減です、彼だけが単純な問題でした-テーブルに2つの部分の名前が必要です。彼の場合、提案は問題を解決しました。彼のコードを見た後、主な違いは、コマンドオブジェクトと依存関係オブジェクトが作成されるまで接続オブジェクトを開くのを待っていることに気づきました。私の唯一の仮定は内部にあります(私はまだリフレクターを開始していないので、仮定だけをチェックします)この関連付けのために、Connectionオブジェクトが異なる方法で開かれるか、イベントとコマンドの順序が異なります。

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc9ca094-a989-4403-82c6-7f608ed462ce/sql-server-not-creating-subscription-for-simple-select-query-when- using-sqlcachedependency?forum = sqlservicebroker

これが同様の問題で他の誰かに役立つことを願っています。

于 2014-12-11T16:40:55.180 に答える