Usar procedimientos almacenados de envío de eventos

Notification Services proporciona procedimientos almacenados de recopilación de eventos que le permiten enviar eventos individuales o lotes de eventos. Use estos procedimientos almacenados para enviar eventos utilizando código Transact-SQL. Puede ejecutar estos procedimientos almacenados manualmente, ejecutarlos en un trabajo del Agente de Microsoft SQL Server o utilizarlos en desencadenadores de modo que ejecute la consulta en respuesta a una inserción o actualización en otra tabla.

Enviar datos de eventos

Un conjunto de procedimientos almacenados le permite abrir un lote de eventos, enviar individualmente uno o varios eventos y, a continuación, cerrar el lote de eventos. Use los siguientes procedimientos almacenados para enviar eventos individuales a una aplicación de Notification Services:

  • NSEventBeginBatchEventClassName obtiene el nombre del proveedor de eventos que envía los datos de eventos como un argumento de entrada y devuelve el identificador de lote del nuevo lote de eventos.
  • NSEventWriteEventClassName agrega un solo evento al lote de eventos. Estos argumentos de procedimientos almacenados son el identificador del lote de eventos y una lista de valores de los campos de evento.
  • NSEventFlushBatchEventClassName cierra el lote de eventos y envía el conjunto de eventos a la aplicación

Asegúrese de que ejecuta todos estos procedimientos almacenados en la misma transacción para que Notification Services abra el lote, envíe los eventos y, a continuación, cierre el lote en una transacción.

Para obtener más información y ejemplos, vea los siguientes temas de procedimientos almacenados:

Usar una consulta para recopilar y enviar eventos

Si desea recopilar eventos mediante una instrucción SELECT, puede utilizar el procedimiento almacenado NSEventSubmitBatchEventClassName. Este procedimiento almacenado usa dos consultas: una para recopilar eventos utilizando una consulta que se ha definido y una consulta posterior a la recopilación (que se denomina consulta posterior) que se ejecuta después de recopilar eventos. Puede utilizar esta consulta posterior para realizar cualquier limpieza necesaria, como cambiar un campo de seguimiento de "nuevo" a "recopilado" para no recopilar de nuevo los mismos datos.

Para obtener más información y un ejemplo, vea NSEventSubmitBatch<EventClassName> (Transact-SQL).

Usar los procedimientos almacenados de envío de eventos en aplicaciones

Puede ejecutar los procedimientos almacenados de recopilación de eventos en código administrado y no administrado. Una forma habitual de ejecutar un procedimiento almacenado en código administrado es utilizar un objeto SqlCommand. Puede especificar un procedimiento almacenado y sus argumentos en el objeto SqlCommand y, a continuación, ejecutar el procedimiento utilizando su método ExecuteNonQuery.

Ejemplo: agregar un solo evento

En este ejemplo se utilizan los siguientes espacios de nombres:

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

Ejemplo: agregar varios eventos

En este ejemplo se utilizan los siguientes espacios de nombres:

  • 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;
}

Vea también

Otros recursos

Desarrollar un proveedor de eventos personalizados
Procedimientos almacenados de Notification Services (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005