Domanda

Ho un database in esecuzione su MS SQL Server 2005 e un'applicazione Web ASP.NET 3.5.

Il database contiene un catalogo di prodotti, che sto usando per alimentare "pagine" in un CMS in esecuzione nella web app. Una volta che le pagine sono state create le cache di applicazione in modo ho bisogno di notificare l'applicazione di questo cambiamento in modo che possa ricreare gli oggetti della pagina.

Il CMS utilizza il proprio caching in modo uno SqlCacheDependency non può essere utilizzato per eseguire questa operazione.

Quando ho fuoco l'applicazione fino io capisco un abbonato che appaiono nel risultato di

select * from sys.dm_qn_subscriptions

Ma non appena ho aggiungere alcuni dati alla tabella, le scompare abbonati e l'evento OnChanged mai incendi.

Nel mio codice di avvio Ho il seguente

// Ensure the database is setup for notifications
SqlCacheDependencyAdmin.EnableNotifications(DataHelper.ConnectionString);
SqlCacheDependencyAdmin.EnableTableForNotifications(DataHelper.ConnectionString, "Category");
SqlCacheDependencyAdmin.EnableTableForNotifications(DataHelper.ConnectionString, "Product");

if (!SqlDependency.Start(DataHelper.ConnectionString, SqlDependencyQueueName))
     throw new Exception("Something went wrong");

string queueOptions = string.Format("service = {0}", SqlDependencyQueueName);
using (var connection = new SqlConnection(DataHelper.ConnectionString))
{
     connection.Open();
     using (SqlCommand command = new SqlCommand(@"SELECT [CategoryID],[Name]
                   FROM [dbo].[Category]", connection))
     {
           // Create a dependency and associate it with the SqlCommand.
           dependency = new SqlDependency(command, queueOptions, 0);

            // Subscribe to the SqlDependency event.
            dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);

            command.ExecuteReader().Close();
        }
    }

// ...

void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
    Debugger.Break(); // This never hits
    this.ReloadData();
}
È stato utile?

Soluzione

Controlla la tua sys.transmission_queue database. Molto probabilmente la tua notifica (s) ci sarà, trattenuto perché non possono essere consegnati. Il transmission_status avrà una spiegazione perché sta succedendo questo. Per una guida più dettagliata sulla risoluzione dei problemi, vedi Risoluzione dei problemi Dialogs .

Il problema più spesso è dovuto ad eseguire requisiti di infrastruttura come non essere soddisfatte da un database di proprietà dbo orfani e possono essere risolti tramite:

ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa];

tuttavia la soluzione dipende da caso a caso, a seconda del problema reale, come esaminato sopra.

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