Pergunta

Não consigo entender a dependência do SQLCACHEDED com um simples Proc (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

E aqui está meu código ASP.NET (3,5 Framework):

-- 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;

}

Alguém tem alguma sorte em fazer isso funcionar com o SPS? Obrigado!

Foi útil?

Solução

Eu descobri isso, preciso definir opções de consulta antes de criar o SP. Consegui funcionar quando eu criei o SP da seguinte forma:

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

Outras dicas

Você não está retornando dados do cache todas as vezes. Deve ser assim:

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

Outra causa pode ser isso em uma declaração SQL:

AND dbo.[PublishDate] <= GetDate()

o SQLCACHEDENDENCENCIDA Comparará como se os dados subjacentes tivessem mudado mesmo que não o fizeram, pois getDate () é dinâmico (igualmente se você passar por DateTime. agora através de um @parameter).

Isso não foi óbvio para mim depois de reescrever meu PROC, seguindo todas as boas sugestões acima, também não esquecendo também remover "Set Nocount on" do Proc. SQLCACHEDENDENCENCIDA expira o cache se os dados mudarem OU Os valores dos parâmetros de consulta mudam, o que faz sentido, suponho.

Para mim, usar algo assim no PROC armazenado não funcionou.

select id, name from dbo.tblTable;

Eu tive que colocar explicitamente as referências como essa.

select dbo.tblTable.id, dbo.tblTable.name from dbo.tblTable;

O cache SQL não funcionará se você usar select *, também você precisa garantir que você coloque dbo (ou esquema relevante) na frente do nome da sua tabela. Você também pode verificar o SQL Profiler para verificar se o seu sql é Run Hope vai te ajudar etc ....

Observe que você não pode usar

com (Nolock)

no procedimento armazenado ou na dependência permanecerá constantemente inválida. Isso não parece ser mencionado na documentação, tanto quanto eu sei

Percebo que o pôster original não fez isso, mas qualquer pessoa que vem aqui que tenha o problema declarado no título pode ter feito isso, então pensei que valia a pena mencionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top