Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Службы 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)