Share via


Detección de cambios con SqlDependency

Descargar ADO.NET

Un objeto SqlDependency se puede asociar a SqlCommand para detectar cuándo los resultados de la consulta difieren de los recuperados originalmente. También puede asignar un delegado al evento OnChange, que se activará cuando cambien los resultados de un comando asociado. Asocie SqlDependency con el comando antes de ejecutar el comando. La propiedad HasChanges de SqlDependency también se puede utilizar para determinar si los resultados de la consulta han cambiado desde que se recuperaron los datos por primera vez.

Consideraciones sobre la seguridad

La infraestructura de dependencias se basa en un objeto SqlConnection que se abre cuando se llama a Start para recibir notificaciones de que los datos subyacentes han cambiado para un comando determinado. La capacidad de que un cliente inicie la llamada a SqlDependency.Start se controla mediante SqlClientPermission y atributos de seguridad de acceso de código. Para obtener más información, consulte Habilitación de notificaciones de consultas.

Ejemplo

En los pasos siguientes se muestra cómo declarar una dependencia, ejecutar un comando y recibir una notificación cuando cambia el conjunto de resultados:

  1. Inicie una conexión SqlDependency al servidor.

  2. Cree objetos SqlConnection y SqlCommand para conectarse al servidor y definir una instrucción Transact-SQL.

  3. Cree un objeto SqlDependency, o bien use uno que ya exista y enlácelo al objeto SqlCommand. De manera interna, esta asociación crea un objeto SqlNotificationRequest y lo enlaza al objeto de comando según sea necesario. Esta solicitud de notificación contiene un identificador interno que identifica de forma única este objeto SqlDependency. También inicia el cliente de escucha del cliente si todavía no está activo.

  4. Suscriba un controlador de eventos al evento OnChange del objeto SqlDependency.

  5. Ejecute el comando con cualquiera de los métodos Execute del objeto SqlCommand. Dado que el comando está enlazado al objeto de notificación, el servidor reconoce que debe generar una notificación y la información de la cola apunta a la cola de dependencias.

  6. Se ha perdido la conexión de SqlDependency al servidor.

Si después un usuario cambia los datos subyacentes, Microsoft SQL Server detecta que hay una notificación pendiente para ese cambio y envía una notificación que se procesa y reenvía al cliente por medio del objeto SqlConnection subyacente que se ha creado con una llamada a SqlDependency.Start. El agente de escucha del cliente recibe el mensaje de invalidación. A continuación, el agente de escucha del cliente busca el objeto SqlDependency asociado y activa el evento OnChange.

En el fragmento de código siguiente se muestra el patrón de diseño que se usaría para crear una aplicación de ejemplo.

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
    // Assume connection is an open SqlConnection.

    // Create a new SqlCommand object.
    using (SqlCommand command=new SqlCommand(
        "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers",
        connection))
    {

        // Create a dependency and associate it with the SqlCommand.
        SqlDependency dependency=new SqlDependency(command);
        // Maintain the reference in a class member.

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

        // Execute the command.
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // Process the DataReader.
        }
    }
}

// Handler method
void OnDependencyChange(object sender,
   SqlNotificationEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}

void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}

Pasos siguientes