Обработка событий SMO
На некоторые типы событий сервера можно подписаться с помощью обработчика событий и объекта ServerConnection.
Многие классы экземпляров в SQL Server управляющих объектах (SMO) могут активировать события при выполнении определенных действий на сервере.
Эти события можно обрабатывать программно, если установить обработчик события и подписаться на связанные события. Этот тип обработки событий является переходным, поскольку все подписки удаляются при завершении клиентской программы SMO.
Обработка события ConnectionContext
Объект ServerConnection поддерживает несколько типов событий. Свойство события необходимо задать равным экземпляру соответствующего обработчика события, а объект обработчика события следует определить как защищенную функцию, обрабатывающую событие.
Подписка на событие
Для обработки некоторого события пишется класс обработчика этого события, создается его экземпляр, этот обработчик события назначается родительскому объекту, затем производится подписка на данное событие.
Для обработки событий необходимо написать класс обработчика события. Класс обработчика события может содержать более одной функции обработки события, и его надо установить для обрабатываемых событий. Функции обработчика событий получают сведения о событии из параметра ServerEventNotificatificationArgs , который можно использовать для передачи сведений о событии.
Типы событий базы данных и сервера, которые можно обрабатывать, перечислены в DatabaseEventSet классе и ServerEventSetклассе .
Пример
Чтобы использовать какой-либо из представленных примеров кода, нужно выбрать среду, шаблон и язык программирования, с помощью которых будет создаваться приложение. Дополнительные сведения см. в разделах «Как создать проект Visual Basic SMO в Visual Studio .NET» или «Как создать проект Visual C# SMO в Visual Studio .NET» электронной документации по SQL Server.
Регистрация обработчиков событий и подписка на обработку событий на языке Visual Basic
Данный пример кода показывает, как установить обработчик события и подписаться на события базы данных.
Регистрация обработчиков событий и подписка на обработку событий на языке Visual C#
Данный пример кода показывает, как установить обработчик события и подписаться на события базы данных.
//Create an event handler subroutine that runs when a table is created.
private void MyCreateEventHandler(object sender, ServerEventArgs e)
{
Console.WriteLine("A table has just been added to the AdventureWorks2012 database.");
}
//Create an event handler subroutine that runs when a table is deleted.
private void MyDropEventHandler(object sender, ServerEventArgs e)
{
Console.WriteLine("A table has just been dropped from the AdventureWorks2012 database.");
}
public void Main()
{
//Connect to the local, default instance of SQL Server.
Server srv;
srv = new Server();
//Reference the AdventureWorks2012 database.
Database db;
db = srv.Databases("AdventureWorks2012");
//Create a database event set that contains the CreateTable event only.
DatabaseEventSet databaseCreateEventSet = new DatabaseEventSet();
databaseCreateEventSet.CreateTable = true;
//Create a server event handler and set it to the first event handler subroutine.
ServerEventHandler serverCreateEventHandler;
serverCreateEventHandler = new ServerEventHandler(MyCreateEventHandler);
//Subscribe to the first server event handler when a CreateTable event occurs.
db.Events.SubscribeToEvents(databaseCreateEventSet, serverCreateEventHandler);
//Create a database event set that contains the DropTable event only.
DatabaseEventSet databaseDropEventSet = new DatabaseEventSet();
databaseDropEventSet.DropTable = true;
//Create a server event handler and set it to the second event handler subroutine.
ServerEventHandler serverDropEventHandler;
serverDropEventHandler = new ServerEventHandler(MyDropEventHandler);
//Subscribe to the second server event handler when a DropTable event occurs.
db.Events.SubscribeToEvents(databaseDropEventSet, serverDropEventHandler);
//Start event handling.
db.Events.StartEvents();
//Create a table on the database.
Table tb;
tb = new Table(db, "Test_Table");
Column mycol1;
mycol1 = new Column(tb, "Name", DataType.NChar(50));
mycol1.Collation = "Latin1_General_CI_AS";
mycol1.Nullable = true;
tb.Columns.Add(mycol1);
tb.Create();
//Remove the table.
tb.Drop();
//Wait until the events have occured.
int x;
int y;
for (x = 1; x <= 1000000000; x++) {
y = x * 2;
}
//Stop event handling.
db.Events.StopEvents();
}