Поделиться через


Использование хранимых процедур отправки событий

Службы Notification Services предоставляют хранимые процедуры сбора событий, позволяющие отправлять отдельные события или пакеты событий. Эти хранимые процедуры применяются для отправки событий с использованием кода Transact-SQL. Их можно запускать вручную, в составе задания агента Microsoft SQL Server или использовать в триггерах, чтобы в ответ на вставку или обновление в другой таблице запускался запрос.

Отправка данных событий

Один набор хранимых процедур позволяет открыть пакет событий, отдельно отправить одно или несколько событий, а затем закрыть пакет событий. Для отправки отдельных событий приложению служб Notification Services используются следующие хранимые процедуры:

  • Процедура NSEventBeginBatchимя_класса_события принимает в качестве входного аргумента имя поставщика событий, отправляющего данные события, и возвращает идентификатор нового пакета событий.
  • Процедура NSEventWriteимя_класса_события добавляет отдельное событие к пакету событий. Аргументами этих хранимых процедур являются идентификатор пакета событий и список значений полей событий.
  • Процедура NSEventFlushBatchимя_класса_события закрывает пакет событий и отправляет набор событий приложению.

Обязательно запускайте все эти хранимые процедуры в одной транзакции, чтобы службы Notification Services открывали пакет, отправляли события, а затем закрывали пакет в одной транзакции.

Дополнительные сведения и примеры см. в следующих разделах по хранимым процедурам:

Использование запроса для сбора и отправки событий

Если необходимо собирать события с применением инструкции SELECT, можно использовать хранимую процедуру NSEventSubmitBatchимя_класса_события. Эта хранимая процедура использует два запроса: один — для сбора событий с использованием определенного запроса и другой — после сбора (запрос отправки) для запуска после сбора событий. Этот запрос отправки можно использовать для выполнения необходимой очистки, например для изменения значения поля отслеживания с «new» на «collected», чтобы не собирать те же данные повторно.

Дополнительные сведения и пример см. в разделе NSEventSubmitBatch<EventClassName> (Transact-SQL).

Использование хранимых процедур отправки событий в приложениях

Хранимые процедуры сбора событий можно запускать как из управляемого, так и из неуправляемого кода. Распространенным способом запуска хранимой процедуры из управляемого кода является использование объекта SqlCommand. В объекте SqlCommand можно задать хранимую процедуру и ее аргументы, а затем запустить эту процедуру с использованием метода ExecuteNonQuery.

Пример. Добавление отдельного события

В этом примере используются следующие пространства имен:

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

Пример. Добавление нескольких событий

В этом примере используются следующие пространства имен:

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

См. также

Другие ресурсы

Разработка пользовательского поставщика событий
Хранимые процедуры служб Notification Services (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005