Уведомления SQL Server - My OnChange не запускается из службы Windows - PullRequest
0 голосов
/ 06 сентября 2011

Я хотел бы использовать уведомления SQL Server для захвата событий вставки / обновления в моей базе данных в службе Windows. Я пытаюсь использовать объект SQLDependency. Статьи MSDN заставляют это казаться довольно прямым. Поэтому я создал небольшой пример приложения, чтобы попробовать его. при внесении изменений в данные в таблице не возникает событие OnChange, как это может показаться. Может кто-нибудь сказать мне, что мне не хватает? Спасибо! образец моего кода ниже.

private bool CanRequestNotifications()
{
    SqlClientPermission permit = new
    SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
    try
    {
        permit.Demand();
        return true;
    }
    catch (System.Exception exc)
    {
        return false;
    }
}

private void NotificationListener()
{
    string mailSQL;
    SqlConnection sqlConn;
    try
    {
        string connString = "Data Source=xyz;Initial Catalog=abc;User ID=sa;Password=******";
        mailSQL = "SELECT * FROM [tbl_test]";

        SqlDependency.Stop(connString);
        SqlDependency.Start(connString);

        sqlConn = new SqlConnection(connString);
        SqlCommand sqlCmd = new SqlCommand(mailSQL, sqlConn);
        this.GetNotificationData();
        evtLog.WriteEntry("Error Stage: NotificationListener" + "Error desc:" + "Message", EventLogEntryType.Error);
    }
    catch (Exception e)
    {
        // handle exception
    }
}

private void GetNotificationData()
{
    DataSet myDataSet = new DataSet();
    SqlCommand sqlCmd = new SqlCommand();
    sqlCmd.Notification = null;

    SqlDependency dependency = new SqlDependency(sqlCmd);
    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
    evtLog.WriteEntry("Error Stage: GetNotificationData" + "Error desc:" + "Message", EventLogEntryType.Error);
}

private void dependency_OnChange(object sender,SqlNotificationEventArgs e)
{
    SqlDependency dependency = (SqlDependency)sender;
    dependency.OnChange -= dependency_OnChange;
    this.GetNotificationData();
    evtLog.WriteEntry("Error Stage: dependency_OnChange" + "Error desc:" + "Message", EventLogEntryType.Error);
}

protected override void OnStart(string[] args)
{
    CanRequestNotifications();
    NotificationListener();
}

protected override void OnStop()
{
    SqlDependency dependency = new SqlDependency();
    dependency.OnChange -= dependency_OnChange;
    SqlDependency.Stop(connString);
}

1 Ответ

0 голосов
/ 06 сентября 2011

Кажется, что вы используете новый экземпляр SqlDependency для каждой операции - это не будет работать в долгосрочной перспективе; у вас должна быть ссылка на один экземпляр, доступный для тех частей кода, которым он нужен - это может помочь в решении ваших проблем.

Кроме того, я не вижу, что вы изменяете какие-либо данные, вы создаете соединение и команду, но выполнение не выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...