Использование хранимых процедур отправки событий
Службы Notification Services предоставляют хранимые процедуры сбора событий, позволяющие отправлять отдельные события или пакеты событий. Эти хранимые процедуры применяются для отправки событий с использованием кода Transact-SQL. Их можно запускать вручную, в составе задания агента Microsoft SQL Server или использовать в триггерах, чтобы в ответ на вставку или обновление в другой таблице запускался запрос.
Отправка данных событий
Один набор хранимых процедур позволяет открыть пакет событий, отдельно отправить одно или несколько событий, а затем закрыть пакет событий. Для отправки отдельных событий приложению служб Notification Services используются следующие хранимые процедуры:
- Процедура NSEventBeginBatchимя_класса_события принимает в качестве входного аргумента имя поставщика событий, отправляющего данные события, и возвращает идентификатор нового пакета событий.
- Процедура NSEventWriteимя_класса_события добавляет отдельное событие к пакету событий. Аргументами этих хранимых процедур являются идентификатор пакета событий и список значений полей событий.
- Процедура NSEventFlushBatchимя_класса_события закрывает пакет событий и отправляет набор событий приложению.
Обязательно запускайте все эти хранимые процедуры в одной транзакции, чтобы службы Notification Services открывали пакет, отправляли события, а затем закрывали пакет в одной транзакции.
Дополнительные сведения и примеры см. в следующих разделах по хранимым процедурам:
- NSEventBeginBatch<EventClassName> (Transact-SQL)
- NSEventWrite<ИмяКлассаСобытий> (Transact-SQL)
- NSEventFlushBatch<EventClassName> (Transact-SQL)
Использование запроса для сбора и отправки событий
Если необходимо собирать события с применением инструкции 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)