Попадания в константную базу данных SqlDependency

Я только что скопировал пример из официального источника Microsoft http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx, и я озадачен этим. Запустив приложение, оно постоянно обращается к базе данных, хотя эта таблица ничем не используется? Я думал, когда эта таблица действительно изменится, событие сработает? Я не хочу, чтобы он делал постоянные вызовы БД каждую секунду, это ужасно.

Я сделал что-то не так? Я думаю, я не знаю, что, хотя. У кого-нибудь есть ссылка на хороший пример, желательно не MSDN.

Заранее спасибо, Онам.

Это SQL:

return "SELECT [ID],[FromMachine],[FromStore],[FromUser] FROM dbo.Store_Message";

По запросу весь код:

    public partial class Form1 : Form
{
    string connectionString = "server=localhost;database=usicoal;uid=admin;password=";

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        GetNames();
    }

    private bool DoesUserHavePermission()
    {
        try
        {
            SqlClientPermission clientPermission = new SqlClientPermission(PermissionState.Unrestricted);
            clientPermission.Demand();
            return true;
        }
        catch
        {
            return false;
        }
    }

    void dep_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new MethodInvoker(GetNames));
        }
        else
        {
            GetNames();
        }
        SqlDependency dep = sender as SqlDependency;
        dep.OnChange -= new OnChangeEventHandler(dep_OnChange);
    }

    private void GetNames()
    {
        if (!DoesUserHavePermission())
            return;

        SqlDependency.Stop(connectionString);
        SqlDependency.Start(connectionString);

        using (SqlConnection cn = new SqlConnection(connectionString))
        {
            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT ID FROM dbo.[BTE_SIMPLE_STORE_MESSAGE]";
                cmd.Notification = null;

                SqlDependency dep = new SqlDependency(cmd);
                dep.OnChange += new OnChangeEventHandler(dep_OnChange);

                cn.Open();

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                    }
                }
            }
        }
    }
}

person Dr Schizo    schedule 15.01.2013    source источник


Ответы (2)


SqlDependency обычно работает так, как вы ожидали. Он запускает события, если что-то было изменено в вашей базе данных. Постоянные звонки происходят, если что-то не так с вашим запросом. Важно использовать полное имя таблицы из двух частей (например, dbo.TableName).

Документация MSDN не так плоха — взгляните на более свежую статью или эту одну версию.

person Andreas    schedule 15.01.2013
comment
Я просмотрел эту статью, однако у меня есть SQL Management Studio, открытая на одном экране, и мое приложение на другом, и все, что оно когда-либо делает, это циклически и постоянно опрашивает базу данных с помощью вышеуказанного запроса. Я не знаю, правильно ли это, мне это кажется неправильным? - person Dr Schizo; 15.01.2013
comment
Вы отлаживаете свой код или видите запросы в SQL Profiler? Если вы видите запрос каждую секунду или чаще в SQL Profiler => это определенно неправильно. Не могли бы вы добавить соответствующий код С#? - person Andreas; 15.01.2013
comment
Добавлен код, который я использую... в профилировщике SQL я снова и снова вижу оператор select, что заставляет меня думать, что он не работает. - person Dr Schizo; 15.01.2013
comment
О, сладкий Иисус, это пламенная база данных, которая шатается ARGH! Только что создал новую базу данных, подумал, что это будет долгий путь, и использовал тот же код, и это сработало! Милый Иисус не уверен, что происходит, но расследует. - person Dr Schizo; 15.01.2013
comment
Уровень совместимости должен быть установлен на SQL Server 2008 (100). Любые идеи, почему он должен быть установлен на этом уровне? - person Dr Schizo; 15.01.2013
comment
Вы восстанавливали БД из резервной копии? Иногда это приводит к низкому уровню совместимости. Ответ, почему вам нужно 90 или выше, можно найти здесь Создание запроса на уведомление =› см. первое примечание - person Andreas; 15.01.2013

Обнаружил, что приведенный выше код был в порядке, когда я:

  • Щелкните правой кнопкой мыши базу данных, выберите свойства
  • Выберите параметры
  • Установите уровень совместимости SQL Server 2008 (100)
  • OK

Бан код работает корректно.

person Dr Schizo    schedule 15.01.2013