Pregunta

No puedo conseguir SqlCacheDependency al trabajo con un simple procedimiento almacenado (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

Y aquí está mi código de ASP.NET (3,5 marco):

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

}

Alguien tiene un poco de suerte con conseguir que esto funcione con SP? Gracias!

¿Fue útil?

Solución

i cuenta de esto, necesidad de ajustar las opciones de consulta antes de crear el SP. tengo trabajo cuando creé el SP de la siguiente manera:

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

Otros consejos

Usted no está enviando datos desde la memoria caché cada vez. Debe ser como la siguiente:

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

Otra causa puede ser esto en una sentencia SQL:

AND dbo.[PublishDate] <= GetDate()

La SqlCacheDependency se comportará como si el dato subyacente ha cambiado, incluso si no tiene, ya que GetDate () es dinámica (igualmente si tuviera que pasar a través de un DateTime.Now @parameter).

Esto no era obvio para mí después de re-escribir mi proc siguiendo todas las sugerencias buenas anterior, también sin olvidar también para eliminar "SET NOCOUNT ON" en el proc. SqlCacheDependency expira el caché si los datos cambian o el cambio de valores de los parámetros de consulta, lo cual tiene sentido supongo.

Para mí el uso de algo como esto en el procedimiento almacenado no funcionó.

select id, name from dbo.tblTable;

que tenía que poner de forma explícita en las referencias de este tipo.

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

almacenamiento en caché de SQL no funcionará si utiliza select *, también es necesario para asegurarse de que usted pone dbo (o esquema correspondiente) delante de su nombre de la tabla. También puede comprobar el Analizador de SQL para verificar si se ejecuta el sql esperanza le ayudará etc ....

Tenga en cuenta que no se puede utilizar

con (NOLOCK)

en el procedimiento almacenado o la dependencia permanecerá constante inválida. Esto no parece ser mencionado en la documentación por lo que yo puedo decir

Me doy cuenta de que el cartel original no hacer esto, pero cualquiera que venga aquí que el problema se ha indicado en el título puede haber hecho esto, así que pensé que valía la pena mencionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top