Зависимость SQL не срабатывает - PullRequest
1 голос
/ 27 января 2012

Я пытался настроить зависимость SQL для запуска по запросу «Количество строк» ​​(написано на C #, SQL Server 2008 Express), но после того, как исходная подписка SQLNotificationType идет, кажется, что обработчик событий никогда не хочет запускаться снова(несмотря на добавляемые строки, я проверил SQL, и он возвращает ожидаемое значение ...).

Мой код указан ниже.Любые мысли очень ценятся!

РЕДАКТИРОВАТЬ: Проект, в котором этот код является программой WPF.Этот конкретный код хранится в отдельном классе, который моя программа WPF создает в обработчике события «Initialized».Затем у меня есть метод в этом классе, который сначала вызывает ConnectToDatabase (), а затем вызывает SetupSQLDependency ().

РЕДАКТИРОВАТЬ 2: В качестве примечания, эта программа представляет собой WPF, который я надеялся распространить среди нескольких пользователей.Цель состояла в том, чтобы обновлять WPF с определенной информацией при добавлении новых строк в базу данных.Я подумал, что это будет лучшим способом решения этой проблемы, вместо того, чтобы всегда запрашивать базу данных.

        private void ConnectToDatabase()
        {
        //This method is the first to be called, and is the entry 
        // point into my SQL database code.

            databaseConnection = new SqlConnection(connectionString);

            // Setup command used in SqlDependecy 
            SqlCommand tempCmd = new SqlCommand();
            tempCmd.Connection = databaseConnection;
            tempCmd.CommandText = "SELECT COUNT(ID) FROM [Example].[dbo].[ExampleTable]";
            sqlCmd = tempCmd;

            try
            { databaseConnection.Open(); }
            catch (Exception e)
            { writeDebug(e.ToString()); }
        }        

        private void SetupSQLDependency()
        {
            SqlDependency.Stop(connectionString);
            SqlDependency.Start(connectionString);

            sqlCmd.Notification = null;

            // create new dependency for SqlCommand
            SqlDependency sqlDep = new SqlDependency(sqlCmd);
            sqlDep.OnChange += new OnChangeEventHandler(sqlDep_OnChange);

            SqlDataReader reader = sqlCmd.ExecuteReader();
        }

        private void sqlDep_OnChange(object sender, SqlNotificationEventArgs e)
        {
            // FROM: http://msdn.microsoft.com/en-us/a52dhwx7.aspx

            if (e.Type == SqlNotificationType.Change)
            {
            //++++++ THIS IS THE BLOCK THAT IS NEVER TRIGGERED ++++++//
                // Have to remove this as it only work's once
                SqlDependency sqlDep = sender as SqlDependency;
                sqlDep.OnChange -= sqlDep_OnChange;

                // Resetup Dependecy
                SetupSQLDependency();
            }
            else if (e.Type == SqlNotificationType.Subscribe)
            {
                double te = 12; // Used this just to test a break... code is useless
            }
        }

1 Ответ

1 голос
/ 09 февраля 2012

Я считаю, что проблема здесь в COUNT. Обратитесь к документации MSDN для поддерживаемых операторов SELECT для получения дополнительной информации:

Проецируемые столбцы в операторе SELECT могут не содержать агрегатных выражений, если только оператор не использует выражение GROUP BY. Когда предоставляется выражение GROUP BY, список выбора может содержать агрегатные функции COUNT_BIG () или SUM (). [...]

...