Detectar cambios con SqlDependencyDetecting Changes with SqlDependency

Un objeto SqlDependency se puede asociar a SqlCommand para detectar si los resultados de consulta son diferentes de los recuperados originalmente.A SqlDependency object can be associated with a SqlCommand in order to detect when query results differ from those originally retrieved. También puede asignar un delegado al evento OnChange, que se activará cuando los resultados cambien en un comando asociado.You can also assign a delegate to the OnChange event, which will fire when the results change for an associated command. Para poder ejecutar el comando, debe asociar SqlDependency con el comando.You must associate the SqlDependency with the command before you execute the command. 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.The HasChanges property of the SqlDependency can also be used to determine if the query results have changed since the data was first retrieved.

Consideraciones de seguridadSecurity Considerations

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.The dependency infrastructure relies on a SqlConnection that is opened when Start is called in order to receive notifications that the underlying data has changed for a given command. 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 del código.The ability for a client to initiate the call to SqlDependency.Start is controlled through the use of SqlClientPermission and code access security attributes. Para obtener más información, vea habilitar notificaciones de consulta y seguridad de acceso del código y ADO.net.For more information, see Enabling Query Notifications and Code Access Security and ADO.NET.

EjemploExample

Los pasos siguientes muestran cómo declarar una dependencia, ejecutar un comando y recibir una notificación cuando cambie el conjunto de resultados:The following steps illustrate how to declare a dependency, execute a command, and receive a notification when the result set changes:

  1. Inicie una conexión SqlDependency al servidor.Initiate a SqlDependency connection to the server.

  2. Cree objetos SqlConnection y SqlCommand para conectarse al servidor y defina una instrucción Transact-SQL.Create SqlConnection and SqlCommand objects to connect to the server and define a Transact-SQL statement.

  3. Cree un objeto SqlDependency nuevo o utilice uno ya existente, y enlácelo al objeto SqlCommand.Create a new SqlDependency object, or use an existing one, and bind it to the SqlCommand object. Con ello se crea, a nivel interno, un objeto SqlNotificationRequest y se enlaza al objeto de comando si es necesario.Internally, this creates a SqlNotificationRequest object and binds it to the command object as needed. Esta solicitud de notificación contiene un identificador interno que identifica de forma única este objeto SqlDependency.This notification request contains an internal identifier that uniquely identifies this SqlDependency object. Con ello también se inicia la escucha de cliente si aún no se ha activado.It also starts the client listener if it is not already active.

  4. Suscriba un controlador de eventos al evento OnChange del objeto SqlDependency.Subscribe an event handler to the OnChange event of the SqlDependency object.

  5. Ejecute el comando mediante uno de los métodos Execute del objeto SqlCommand.Execute the command using any of the Execute methods of the SqlCommand object. 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.Because the command is bound to the notification object, the server recognizes that it must generate a notification, and the queue information will point to the dependencies queue.

  6. Detenga la conexión SqlDependency al servidor.Stop the SqlDependency connection to the server.

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.If any user subsequently changes the underlying data, Microsoft SQL Server detects that there is a notification pending for such a change, and posts a notification that is processed and forwarded to the client through the underlying SqlConnection that was created by calling SqlDependency.Start. La escucha de cliente recibe el mensaje de invalidación.The client listener receives the invalidation message. A continuación, la escucha de cliente localiza el objeto SqlDependency asociado y activa el evento OnChange.The client listener then locates the associated SqlDependency object and fires the OnChange event.

El siguiente fragmento de código muestra el patrón de diseño que se puede utilizar para crear una aplicación de ejemplo.The following code fragment shows the design pattern you would use to create a sample application.

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.
    Using 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 refernce in a class member.
        ' Subscribe to the SqlDependency event.
        AddHandler dependency.OnChange, AddressOf OnDependencyChange

        ' Execute the command.
        Using reader = command.ExecuteReader()
            ' Process the DataReader.
        End Using
    End Using
End Sub

' Handler method
Sub OnDependencyChange(ByVal sender As Object, _
    ByVal e As SqlNotificationEventArgs)
    ' Handle the event (for example, invalidate this cache entry).
End Sub

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.
    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);
}

Vea tambiénSee also