Detectar cambios con SqlDependency (ADO.NET)

Actualización: November 2007

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

Consideraciones de seguridad

La infraestructura de dependencia se basa en un SqlConnection que se abre cuando se llama a Start para recibir notificaciones de que los datos subyacentes han cambiado para un comando concreto. La capacidad de un cliente de iniciar la llamada a SqlDependency.Start se controla mediante el uso de SqlClientPermission y los atributos de seguridad de acceso a código. Para obtener más información, vea Habilitación de notificaciones de consulta (ADO.NET) y Seguridad de acceso del código y ADO.NET.

Ejemplo

Los pasos siguientes muestran cómo declarar una dependencia, ejecutar un comando y recibir una notificación cuando cambie el conjunto de resultados:

  1. Inicie una conexión SqlDependency al servidor.

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

  3. Cree un objeto SqlDependency nuevo o utilice uno ya existente, y enlácelo al objeto SqlCommand. Con ello se crea, a nivel interno, un objeto SqlNotificationRequest y se enlaza al objeto de comando si es necesario. Esta solicitud de notificación contiene un identificador interno que identifica de forma única este objeto SqlDependency. Con ello también se inicia la escucha de cliente si aún no se ha activado.

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

  5. Ejecute el comando mediante uno de los métodos Execute del objeto SqlCommand. Como 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 apuntará a la cola de dependencias.

  6. Detenga la conexión SqlDependency al servidor.

Si algún usuario cambia posteriormente los datos subyacentes, Microsoft SQL Server detecta que hay una notificación pendiente de tal cambio y publica una notificación que se procesa y reenvía al cliente a través del SqlConnection subyacente que se creó llamando a SqlDependency.Start. La escucha de cliente recibe el mensaje de invalidación. A continuación, la escucha de cliente localiza el objeto SqlDependency asociado y activa el evento OnChange.

El siguiente fragmento de código muestra el patrón de diseño que se puede utilizar para crear una aplicación de ejemplo.

Sub Initialization()
    ' Create a dependency connection.
    SqlDependency.Start(connectionString, queueName)
End Sub

Sub SomeMethod() 
    ' Assume connection is an open SqlConnection.
    ' Create a new SqlCommand object.
    Dim command As New SqlCommand( _
       "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", _
       connection)
    
    ' Create a dependency and associate it with the SqlCommand.
    Dim dependency As New SqlDependency(command)
    ' Maintain the refence in a class member.
    ' Subscribe to the SqlDependency event.
    AddHandler dependency.OnChange, AddressOf OnDependencyChange
    
    ' Execute the command.
    command.ExecuteReader()

   ' Process the DataReader.
End Sub 

' Handler method
Sub OnDependencyChange(ByVal sender As Object, ByVal e As SqlNotificationsEventArgs) 

End Sub
' Handle the event (for example, invalidate this cache entry).

Sub Termination()
    ' Release the dependency
    SqlDependency.Stop(connectionString, queueName)
End Sub
void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

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

  // Create a new SqlCommand object.
  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 refence in a class member.

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

  // Execute the command.
  command.ExecuteReader();
  // Process the DataReader.
}

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

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

Vea también

Otros recursos

Notificaciones de consulta en SQL Server (ADO.NET)