Domanda

Non riesco a SqlCacheDependency di lavorare con una semplice stored procedure (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

Ed ecco il mio codice ASP.NET (3.5 quadro):

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

}

Qualcuno ha fortuna con ottenere questo a lavorare con SP? Grazie!

È stato utile?

Soluzione

I capito questo, bisogno di impostare le opzioni di query prima di creare la SP. ottenuto che funziona quando ho creato il SP come segue:

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

Altri suggerimenti

Non si restituisce i dati dalla cache ogni volta. Dovrebbe essere così:

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

Un'altra causa può essere presente in una dichiarazione SQL:

AND dbo.[PublishDate] <= GetDate()

Il SqlCacheDependency si comporterà come se i dati sottostanti è cambiato anche se non ha, in quanto GetDate () è dinamico (altrettanto se si dovesse passare attraverso un DateTime.Now @parameter).

Questo non era evidente per me dopo la ri-scrivere il mio proc seguendo tutti i buoni suggerimenti di cui sopra, anche senza dimenticare anche per rimuovere "SET NOCOUNT ON" dal proc. SqlCacheDependency scade la cache se i cambiamenti dati o i parametri di query valori cambiano, che ha un senso suppongo.

Per me usando qualcosa di simile nel proc memorizzato non ha funzionato.

select id, name from dbo.tblTable;

Ho dovuto mettere esplicitamente nei riferimenti di questo tipo.

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

la cache SQL non funziona se si utilizza select *, è anche necessario assicurarsi di mettere dbo (o rilevante dello schema) davanti al nome della tabella. È inoltre possibile controllare SQL Profiler per verificare se il vostro sql viene eseguito speranza vi aiuterà etc ....

Si noti che non è possibile utilizzare

con (NOLOCK)

nella stored procedure o la dipendenza rimarrà costantemente valido. Questo non sembra essere menzionati nella documentazione, per quanto posso dire

Mi rendo conto che il manifesto originale non ha fatto questo, ma chiunque venendo qui che presenta il problema indicato nel titolo può aver fatto questo in modo ho pensato che fosse degno di nota.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top