Rilevamento di modifiche con SqlDependencyDetecting Changes with SqlDependency

È possibile associare un oggetto SqlDependency a SqlCommand per rilevare quando i risultati della query differiscono da quelli recuperati in origine.A SqlDependency object can be associated with a SqlCommand in order to detect when query results differ from those originally retrieved. È inoltre possibile assegnare un delegato all'evento OnChange che verrà generato in caso di modifica dei risultati per un comando associato.You can also assign a delegate to the OnChange event, which will fire when the results change for an associated command. È necessario associare l'oggetto SqlDependency al comando prima di eseguire il comando stesso.You must associate the SqlDependency with the command before you execute the command. È inoltre possibile usare la proprietà HasChanges di SqlDependency per determinare se i risultati della query sono stati modificati rispetto a quando i dati sono stati recuperati inizialmente.The HasChanges property of the SqlDependency can also be used to determine if the query results have changed since the data was first retrieved.

Considerazioni sulla sicurezzaSecurity Considerations

L'infrastruttura della dipendenza si basa su un oggetto SqlConnection che viene aperto quando viene chiamato Start per ricevere le notifiche relative alla modifica dei dati sottostanti per un comando specificato.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. Per controllare se un client è in grado di avviare la chiamata a SqlDependency.Start, vengono usati SqlClientPermission e gli attributi della sicurezza dall'accesso di codice.The ability for a client to initiate the call to SqlDependency.Start is controlled through the use of SqlClientPermission and code access security attributes. Per ulteriori informazioni, vedere abilitazione le notifiche delle Query e sicurezza dall'accesso di codice e ADO.NET.For more information, see Enabling Query Notifications and Code Access Security and ADO.NET.

EsempioExample

Nella procedura seguente viene illustrato come dichiarare una dipendenza, eseguire un comando e ricevere una notifica in caso di modifica del set di risultati:The following steps illustrate how to declare a dependency, execute a command, and receive a notification when the result set changes:

  1. Avviare una connessione SqlDependency al server.Initiate a SqlDependency connection to the server.

  2. Creare gli oggetti SqlConnection e SqlCommand per la connessione al server e definire un'istruzione Transact-SQL.Create SqlConnection and SqlCommand objects to connect to the server and define a Transact-SQL statement.

  3. Creare un nuovo oggetto SqlDependency oppure usarne uno esistente e associarlo all'oggetto SqlCommand.Create a new SqlDependency object, or use an existing one, and bind it to the SqlCommand object. Internamente, questa procedura consente di creare un oggetto SqlNotificationRequest e associarlo all'oggetto comando se necessario.Internally, this creates a SqlNotificationRequest object and binds it to the command object as needed. Questa richiesta di notifica contiene un identificatore interno che identifica in modo univoco l'oggetto SqlDependency.This notification request contains an internal identifier that uniquely identifies this SqlDependency object. In tal modo viene inoltre avviato il listener del client, se non è già attivo.It also starts the client listener if it is not already active.

  4. Sottoscrivere un gestore eventi all'evento OnChange dell'oggetto SqlDependency.Subscribe an event handler to the OnChange event of the SqlDependency object.

  5. Eseguire il comando con uno dei metodi Execute dell'oggetto SqlCommand.Execute the command using any of the Execute methods of the SqlCommand object. Poiché il comando è associato all'oggetto notifica, il server riconosce la necessità di generare una notifica e le informazioni della coda faranno riferimento alla coda delle dipendenze.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. Interrompere la connessione SqlDependency al server.Stop the SqlDependency connection to the server.

Se un qualsiasi utente modifica successivamente i dati sottostanti, in Microsoft SQL Server viene rilevata una notifica in sospeso per una tale modifica, pertanto viene inviata una notifica, che viene elaborata e inoltrata al client tramite l'oggetto SqlConnection sottostante creato mediante la chiamata 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. Il listener del client riceve il messaggio di invalidazione,The client listener receives the invalidation message. quindi individua l'oggetto SqlDependency associato e attiva l'evento OnChange.The client listener then locates the associated SqlDependency object and fires the OnChange event.

Nel frammento di codice seguente è illustrato il modello di progettazione da usare per creare un'applicazione di esempio.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 refence 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 refence 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);  
}  

Vedere ancheSee Also

Notifiche di query in SQL ServerQuery Notifications in SQL Server
Provider gestiti ADO.NET e Centro per sviluppatori di set di datiADO.NET Managed Providers and DataSet Developer Center