質問

SqlCacheDependency を単純なストアド プロシージャ (SQL Server 2008) で動作させることができません。

create proc dbo.spGetPeteTest
as

set  ANSI_NULLS ON
set ANSI_PADDING ON
set ANSI_WARNINGS ON
set CONCAT_NULL_YIELDS_NULL ON
set QUOTED_IDENTIFIER ON
set NUMERIC_ROUNDABORT OFF
set ARITHABORT ON

select Id, Artist, Album
from dbo.PeteTest

そして、これが私のASP.NETコード(3.5フレームワーク)です。

-- global.asax
    protected void Application_Start(object sender, EventArgs e)
{
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString;
    System.Data.SqlClient.SqlDependency.Start(connectionString);
}

 -- Code-Behind
private DataTable GetAlbums()
{
    string connectionString =
    System.Configuration.ConfigurationManager.ConnectionStrings["UnigoConnection"].ConnectionString;

    DataTable dtAlbums = new DataTable();

    using (SqlConnection connection =
        new SqlConnection(connectionString))
    {
    // Works using select statement, but NOT SP with same text
    //SqlCommand command = new SqlCommand(
    //    "select Id, Artist, Album from dbo.PeteTest", connection);
    SqlCommand command = new SqlCommand();
    command.Connection = connection;
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "dbo.spGetPeteTest";


    System.Web.Caching.SqlCacheDependency new_dependency =
        new System.Web.Caching.SqlCacheDependency(command);


    SqlDataAdapter DA1 = new SqlDataAdapter();
    DA1.SelectCommand = command;

    DataSet DS1 = new DataSet();

    DA1.Fill(DS1);

    dtAlbums = DS1.Tables[0];

    Cache.Insert("Albums", dtAlbums, new_dependency);
    }

    return dtAlbums;

}

これを SP で動作させることに成功した人はいますか?ありがとう!

役に立ちましたか?

解決

私はSPを作成する前にセットクエリオプションに必要、このアウトを考え出し。私はSPを作成したときに次のように働いて得ます:

USE [MyDatabase]
GO

set ANSI_NULLS ON
set ANSI_PADDING ON
set ANSI_WARNINGS ON
set CONCAT_NULL_YIELDS_NULL ON
set QUOTED_IDENTIFIER ON
set NUMERIC_ROUNDABORT OFF
set ARITHABORT ON
go


create proc [dbo].[spGetPeteTest]
as

select Id, Artist, Album
from dbo.PeteTest

GO

他のヒント

あなたはキャッシュから毎回データを返すされていません。それは、このようにする必要があります:

if (Cache["Albums"]!=null)
{
   return (DataTable) Cache["Albums"];
}
else
{
  // you need to write coding from database.
}

別の原因としては、SQL ステートメント内の次のことが考えられます。

AND dbo.[PublishDate] <= GetDate()

SQLCacheDependency GetDate() は動的であるため (@parameter 経由で DateTime.Now を渡した場合と同様)、基になるデータが実際には変更されていない場合でも、あたかも変更されたかのように動作します。

上記のすべての良い提案に従ってプロシージャを書き直した後、プロシージャから「SET NOCOUNT ON」を削除することも忘れずに、これは私にとって明らかではありませんでした。 SQLCacheDependency データが変更された場合にキャッシュを期限切れにします または クエリパラメータの値が変化するのは当然だと思います。

ストアドプロシージャでは、このようなものを使用して、私のために

は動作しませんでした。

select id, name from dbo.tblTable;

私は明示的にこのような参考文献に入れていた。

select dbo.tblTable.id, dbo.tblTable.name from dbo.tblTable;
あなたがselect *を使用する場合は、

SQLキャッシュがない仕事、またあなたは、あなたがあなたのテーブル名の前にdbo(または関連するスキーマ)を置くようにする必要があります。 また、あなたのsqlが実行された場合の希望がお手伝いします確認するために、SQLプロファイラを確認することができますなど...

は、

を使用できないことに注意 (NOLOCK)

ストアドプロシージャまたは依存関係にある

は常に無効のままになります。 私の知る限り、これはドキュメントに記載されていないよう。

の私は、元のポスターはこれをしなかったが、私はそれが言及する価値だと思ったので、ここに来て、誰もがタイトルに記載された問題は、これを行っている可能性がしたことと認識しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top