Question

Je ne peux pas SqlCacheDependency de travailler avec un proc stockée simple (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

Et voici mon code ASP.NET (3.5 cadre):

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

}

Quelqu'un a peu de chance à obtenir que cela fonctionne avec SPs? Merci!

Était-ce utile?

La solution

i compris cela, besoin de définir les options de requête avant de créer le SP. obtenu ce travail quand je créé le SP comme suit:

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

Autres conseils

Vous n'êtes pas de renvoyer des données à partir du cache à chaque fois. Il devrait être comme ceci:

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

Une autre cause peut être ceci dans une instruction SQL:

AND dbo.[PublishDate] <= GetDate()

SqlCacheDependency se comporte comme si les données sous-jacente a changé, même si elle n'a pas, depuis GetDate () est dynamique (également si vous deviez passer par un DateTime.Now @parameter).

Ce ne fut pas évident pour moi après réécrivant mon proc suivant toutes les bonnes suggestions ci-dessus, pas non plus oublier également de supprimer « SET NOCOUNT ON » du proc. SqlCacheDependency expire le cache si les modifications de données ou les paramètres de la requête Les valeurs changent, ce qui fait sens, je suppose.

Pour moi en utilisant quelque chose comme ça dans la procédure stockée ne fonctionne pas.

select id, name from dbo.tblTable;

Je devais explicitement mettre dans les références comme celui-ci.

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

cache SQL ne fonctionnera pas si vous utilisez select *, vous devez également vous assurer que vous mettez dbo (ou schéma pertinent) devant votre nom de la table. Vous pouvez également vérifier profileur SQL pour vérifier si votre sql est géré espoir vous aidera etc ....

Notez que vous ne pouvez pas utiliser

avec (NOLOCK)

dans la procédure stockée ou la dépendance demeurera constamment invalide. Cela ne semble pas être mentionné dans la documentation pour autant que je peux dire

Je me rends compte que l'affiche originale n'a pas fait cela, mais ceux qui viennent ici qui a le problème indiqué dans le titre peut avoir fait cela donc je pensais qu'il valait la peine de mentionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top