Member 13714562 Ответов: 2

Как использовать один таймер для проверки базы данных и другой таймер из этой базы данных для выполнения другой работы в службе windows?


I want my windows service to keep checking SQL server table every 30 secs with one timer and get another interval timer value from this table to do another job.

How can I achieve this?


Что я уже пробовал:

protected override void OnStart(string[] args)
        {
            try
            {
                timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
                timer1.Interval = 30000;
                timer1.Enabled = true;
                timer1.Start();

            }
            catch (Exception ex)
            {
                ErrorLogging(ex);
            }
            
        }

        protected override void OnStop()
        {
            timer1.Enabled = false;
        }


        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            try
            {

                con = new SqlConnection("server=servername; database=databasename;uid=username; password=password");
                con.Open();

                cmd = new SqlCommand("Select TOP(1) [IntervalTime] from [dbo].[Intervals] ORDER BY [IntervalTime] DESC", con);
                int interval = cmd.ExecuteNonQuery();

                timer2.Elapsed += new ElapsedEventHandler(timer2_Elapsed);
                timer2.Interval = interval;
                timer2.Enabled = true;
                timer2.Start();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
            finally
            {
                cmd.Dispose();
                con.Dispose();
            }

        }


        private void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
// Do other job
         }

Can anyone please change this code to make it working.

CS2011

Вам следует избегать таймеров. Это даст вам хит производительности. если ваше требование состоит в том, чтобы проверить, были ли некоторые данные обновлены в таблице, и выполнить некоторую работу на основе этого, я бы рекомендовал использовать службу брокера sql server.

2 Ответов

Рейтинг:
20

CS2011

Пожалуйста, сначала прочтите мой комментарий. И после этого, если вы все еще хотите использовать таймер, проблема заключается в

int interval = cmd.ExecuteNonQuery();


этот метод возвращает строки, затронутые запросом, а не данные. вы должны использовать Reader, а затем получить колонку.

Свойство sqlcommand.Метод ExecuteNonQuery (System.Data.SqlClient)[^]

c# - как использовать метод executeReader() для извлечения значения только одной ячейки - переполнение стека[^]


Member 13714562

Огромное спасибо. Это работает. Я использовал cmd.ExecuteScalar().

CS2011

Вы можете выполнить запрос на SSMS и увидеть, что результат совпадает с тем, который вы получаете. В основном этот запрос будет сортировать данные по интервалу времени, и будет возвращено самое высокое значение. Таким образом, если столбец IntervalTime уже имеет значение 700, а вы вставляете значение 500 после этого, он все равно вернет 700.

Рейтинг:
0

Christian Graus

Ваш код имеет один таймер, и вы говорите, что хотите два таймера. Ответ кажется очевидным...

Он включает в себя создание переменной, которую вы можете назвать "timer2".....


Member 13714562

Конечно, я объявил его как глобальную переменную.

Компонент timer1-таймер = новый таймер();
Timer2 таймер = новый таймер();