Partager via


Utilisation des procédures stockées de soumission d'événements

Notification Services fournit des procédures stockées de collection d'événements qui vous permettent de soumettre des événements individuels ou des lots d'événements. Utilisez ces procédures stockées pour soumettre des événements utilisant le code Transact-SQL. Vous avez la possibilité de les exécuter manuellement, de les exécuter dans un travail de l'agent SQL Server ou de les utiliser dans des déclencheurs afin de pouvoir exécuter la requête en réponse à une insertion ou à une mise à jour dans une autre table.

Soumission des données d'événement

Un ensemble unique de procédures stockées vous permet d'ouvrir un lot d'événements, de soumettre individuellement un ou plusieurs événements et de fermer le lot d'événements. Utilisez les procédures stockées suivantes pour soumettre des événements individuels à une application Notification Services :

  • NSEventBeginBatchEventClassName prend le nom du fournisseur d'événements qui soumet les données d'événement en tant qu'argument d'entrée et retourne l'ID de lot du nouveau lot d'événements.
  • NSEventWriteEventClassName ajoute un événement unique au lot d'événements. Ces arguments de procédure stockée sont l'ID du lot d'événements et une liste de valeurs pour les champs d'événement.
  • NSEventFlushBatchEventClassName ferme le lot d'événements et soumet l'ensemble d'événements à l'application.

Veillez à exécuter toutes ces procédures stockées dans la même transaction afin que Notification Services ouvre le lot, soumette les événements, puis ferme le lot de la transaction.

Pour obtenir plus d'informations et plus d'exemples, consultez les rubriques suivantes sur les procédures stockées :

Utilisation d'une requête pour collecter et pour soumettre des événements

Si vous voulez collecter des événements à l'aide d'une instruction SELECT, vous pouvez utiliser la procédure stockée NSEventSubmitBatchEventClassName : Cette procédure stockée utilise deux requêtes : une requête pour collecter des événements à l'aide d'une requête que vous définissez et une requête de post-collection (appelée post-requête) à exécuter après le regroupement des événements. Vous pouvez utiliser cette post-requête pour effectuer le nettoyage nécessaire, tel que la modification d'un champ de suivi de « nouveau » en « collecté » afin de ne pas regrouper deux fois les mêmes données.

Pour obtenir plus d'informations et un exemple, consultez NSEventSubmitBatch<EventClassName> (Transact-SQL).

Utilisation des procédures stockées de soumission d'événements dans des applications

Vous pouvez exécuter les procédures stockées de collection d'événements dans le code managé et le code non managé. Une façon courante d'exécuter une procédure stockée dans le code managé consiste à utiliser un objet SqlCommand. Vous pouvez spécifier une procédure stockée et ses arguments dans l'objet SqlCommand et exécuter ensuite la procédure à l'aide de sa méthode ExecuteNonQuery.

Exemple : ajout d'un événement unique

Cet exemple utilise les espaces de noms suivants :

public bool EventSPs()
{ 
    // These variables would normally be defined for
    // the class. They would be set based on the values
    // provided by the args argument of the Initialize method.
    string instanceName = "Tutorial";
    string applicationName = "Weather";
    string eventClassName = "WeatherEvents";
    string eventProviderName = "WeatherSPs";

    bool returnValue = true;
    SqlConnection databaseConnection = null;

    try
    {
        // Set the connection to SQL Server.
        databaseConnection = new SqlConnection();
        // Build the connection string.
        StringBuilder connectBuilder = new StringBuilder();
        connectBuilder.Append("Integrated Security=SSPI;");
        connectBuilder.Append("Data Source=MyServer;");
        connectBuilder.Append("Initial Catalog=TutorialWeather");
        databaseConnection.ConnectionString =
            connectBuilder.ToString();
        // Open the connection.
        databaseConnection.Open();

        // Use NSEventBeginBatchEventClassName
        // to create a new event batch and return the ID.
        SqlCommand databaseCommand = new SqlCommand(string.Format
            ("\"NSEventBeginBatch{0}\"", eventClassName));
        databaseCommand.Connection = databaseConnection;
        databaseCommand.CommandType = CommandType.StoredProcedure;
        databaseCommand.Parameters.AddWithValue
            ("@ProviderName", eventProviderName);
        SqlParameter storedProcParameter =
            databaseCommand.Parameters.Add
            ("@EventBatchId", SqlDbType.BigInt);
        storedProcParameter.Direction = ParameterDirection.Output;
        databaseCommand.ExecuteNonQuery();
        long eventBatchId =
            (long)databaseCommand.Parameters["@EventBatchId"].Value;

        // Use NSEventWriteEventClassName
        // to write the event to the database.
        databaseCommand.Parameters.Clear();
        databaseCommand.CommandText =
            string.Format("\"NSEventWrite{0}\"", eventClassName);
        databaseCommand.Parameters.AddWithValue("@EventBatchId", 
            eventBatchId);
        databaseCommand.Parameters.AddWithValue("@City", "Redmond");
        databaseCommand.Parameters.AddWithValue("@Date", "4/5/05");
        databaseCommand.Parameters.AddWithValue("@Low", 50.0);
        databaseCommand.Parameters.AddWithValue("@High", 55.5);
        databaseCommand.Parameters.AddWithValue("@Forecast", 
            "Partly cloudy");
        Console.WriteLine(databaseCommand.CommandText);
        databaseCommand.ExecuteNonQuery();

        // Use NSEventFlushBatchEventClassName
        // to commit the event batch.
        databaseCommand.Parameters.Clear();
        databaseCommand.CommandText =
            string.Format("\"NSEventFlushBatch{0}\"", eventClassName);
        databaseCommand.Parameters.AddWithValue("@EventBatchId", 
            eventBatchId);
        long eventsSubmitted = (long)databaseCommand.ExecuteScalar();
    }
    catch(SqlException ex)
    {
        Console.WriteLine(ex);
    }
    finally
    {
        if (null != databaseConnection)
        {
            databaseConnection.Close();
            databaseConnection = null;
        }
    }
    return true;
}

Exemple : ajout de plusieurs événements

Cet exemple utilise les espaces de noms suivants :

  • System
  • System.Text
  • System.Data
  • System.Data.SqlClient
  • Microsoft.SqlServer.NotificationServices
public bool EventQuery()
{
    // These variables would normally be defined for
    // the class. They would be set based on the values
    // provided by the args argument of the Initialize method.
    string instanceName = "Tutorial";
    string applicationName = "Weather";
    string eventClassName = "WeatherEvents";
    string eventProviderName = "WeatherSPs";

    StringBuilder builder =
        new StringBuilder("SELECT City, GetDate() AS Date, ");
    builder.Append("Low, High, Forecast ");
    builder.Append("FROM dbo.WeatherData;");
    string eventsQuery = builder.ToString();

    bool returnValue = true;
    SqlConnection databaseConnection = null;

    try
    {

        // Set the connection to SQL Server.
        databaseConnection = new SqlConnection();
        // Build the connection string.
        StringBuilder connectBuilder = new StringBuilder();
        connectBuilder.Append("Integrated Security=SSPI;");
        connectBuilder.Append("Data Source=MyServer;");
        connectBuilder.Append("Initial Catalog=TutorialWeather");
        databaseConnection.ConnectionString =
            connectBuilder.ToString();
        // Open the connection.
        databaseConnection.Open();

        // Use NSEventSubmitBatchEventClassName
        // to create and submit a batch of events.
        SqlCommand databaseCommand = new SqlCommand(string.Format
            ("\"NSEventSubmitBatch{0}\"", eventClassName));
        databaseCommand.Connection = databaseConnection;
        databaseCommand.CommandType = CommandType.StoredProcedure;
        databaseCommand.Parameters.AddWithValue
            ("@ProviderName", eventProviderName);
        databaseCommand.Parameters.AddWithValue("@EventsQuery", 
            eventsQuery);
        databaseCommand.Parameters.AddWithValue("@PostQuery", " ");
        long eventsInBatch = (long)databaseCommand.ExecuteScalar();
    }
    catch (SqlException ex)
    {
        Console.WriteLine(ex);
    }
    finally
    {
        if (null != databaseConnection)
        {
            databaseConnection.Close();
            databaseConnection = null;
        }
    }
    return true;
}

Voir aussi

Autres ressources

Développement d'un fournisseur d'événements personnalisé
Procédures stockées de Notification Services (Transact-SQL)

Aide et Informations

Assistance sur SQL Server 2005