Frage

Ich kann nicht SqlCacheDependency an der Arbeit mit einer einfachen gespeicherte Prozedur (SQL Server 2008) erhalten:

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

Und hier ist mein ASP.NET-Code (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;

}

Wer noch kein Glück mit diesem mit SPs an der Arbeit? Dank!

War es hilfreich?

Lösung

Ich dachte, dies heraus, Notwendigkeit Satz Abfrageoptionen, BEVOR Sie das SP zu schaffen. habe es funktioniert, wenn ich die SP wie folgt erstellt:

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

Andere Tipps

Sie kehren nicht Daten aus dem Cache jedes Mal. Es sollte so aussehen:

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

Eine weitere Ursache kann dies in einer SQL-Anweisung:

AND dbo.[PublishDate] <= GetDate()

Die SqlCacheDependency wird verhalten, als ob die zugrunde liegenden Daten geändert hat, auch wenn es seit GetDate nicht hat () ist dynamisch (gleich, ob Sie DateTime.Now über eine @parameter passieren waren).

Das war mir nicht klar, nach dem Umschreiben meiner proc nach all den guten Vorschlägen oben, auch nicht auch aus dem proc „SET NOCOUNT ON“ zu vergessen, zu entfernen. SqlCacheDependency Ablauf der Cache, wenn sich die Daten ändern ODER die Abfrage-Parameter-Werte ändern, was Sinn macht, nehme ich an.

Für mich wie dies in der gespeicherten proc mit so etwas nicht funktioniert hat.

select id, name from dbo.tblTable;

Ich hatte ausdrücklich in den Referenzen wie diese gestellt.

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

SQL-Caching wird nicht funktionieren, wenn Sie select * verwenden, auch müssen Sie sicherstellen, dass Sie setzen dbo (oder ein entsprechendes Schema) vor dem Tabellennamen. Sie können auch SQL Profiler überprüfen, um zu überprüfen, ob Ihre sql Hoffnung Sie etc ausgeführt wird helfen ....

Beachten Sie, dass Sie nicht verwenden können,

mit (NOLOCK)

in der gespeicherten Prozedur oder die Abhängigkeit wird ständig ungültig bleiben. Dies scheint nicht in der Dokumentation erwähnt zu werden, soweit ich das sagen kann,

Ich weiß, dass das ursprüngliche Plakat das nicht tat, aber hier jemand kommt, dass das Problem im Titel angegeben hat, kann dies getan hat, dachte ich, es war erwähnenswert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top