sqldependency asp net mvc example



SqlDependency no dispara (1)

Estoy intentando SqlDepenedency por primera vez. No recibo ninguna notificación sobre la actualización de la base de datos.

Estoy colocando puntos de interrupción dentro: OnChange(object sender, SqlNotificationEventArgs e) ,

pero nunca es golpeado.

Aquí está mi código:

    protected void Page_Load(object sender, EventArgs e)
    {

        Label1.Text = "Cache Refresh: " + DateTime.Now.ToLongTimeString();
        DateTime.Now.ToLongTimeString();
        // Create a dependency connection to the database.
        SqlDependency.Start(GetConnectionString());

        using (SqlConnection connection = new SqlConnection(GetConnectionString()))
        {
            using (SqlCommand command = new SqlCommand(GetSQL(), connection))
            {

                SqlDependency dependency =
                        new SqlDependency(command);

                    // Refresh the cache after the number of minutes
                    // listed below if a change does not occur.
                    // This value could be stored in a configuration file.
                                  connection.Open();

                dgHomeRequests.DataSource = command.ExecuteReader();
                    dgHomeRequests.DataBind();

            }
        }   
    }


    private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        //return "Data Source=(local);Integrated Security=true;" +"Initial Catalog=AdventureWorks;";
        return ConfigurationManager.ConnectionStrings["TestData"].ConnectionString;
    }
    private string GetSQL()
    {
        return "Select [Address] From [UserAccount1]";
    }


    void OnChange(object sender, SqlNotificationEventArgs e)
    {
        // have breakpoint here:
        SqlDependency dependency = sender as SqlDependency;

        // Notices are only a one shot deal
        // so remove the existing one so a new 
        // one can be added

        dependency.OnChange -= OnChange;

        // Fire the event
       /* if (OnNewMessage != null)
        {
            OnNewMessage();
        }*/
    }

También coloqué algunos códigos en el archivo Global.asax:

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        SqlDependency.Start(ConfigurationManager.ConnectionStrings["TestData"].ConnectionString);
    }
    protected void Application_End()
    {
        // Shut down SignalR Dependencies
        SqlDependency.Stop(ConfigurationManager.ConnectionStrings["TestData"].ConnectionString);
    }
}

El servidor SQL está en la máquina local. Estoy ejecutando el código a través de Visual Studio (IIS Express).

  1. Para habilitar el agente de servicio en la base de datos:

    ALTER DATABASE SET ENABLE_BROKER GO

  2. Para suscribir la notificación de consulta, debemos otorgar permiso a la cuenta de servicio de IIS.

    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO “<serviceAccount>”

Supuse que el segundo punto no es necesario ya que es local. Pero traté de darle algunos permisos. No sé si tienen razón, ya que no creo que esté usando el grupo de aplicaciones. Y no necesitan el permiso en el entorno local. si yo mismo soy el usuario y creé el esquema yo mismo.

Una de las preguntas que vi fue la de otorgar:

alter authorization on database::<dbName> to [sa];

También di ese permiso.


Me faltaba: dependency.OnChange += new OnChangeEventHandler(OnChange); El nuevo código se vería así:

               SqlDependency dependency = new SqlDependency(command);

               dependency.OnChange += new OnChangeEventHandler(OnChange);

ahora puedo disparar void OnChange(object sender, SqlNotificationEventArgs e)