0

У меня есть хранимая процедура, написанная на SQL Server 2008 R2, которая должна запускаться ежедневно. Хранимая процедура принимает в качестве параметров две даты start date & end date и на основании этих дат извлекает данные от table A и записывает их в table B.Расписание Windows Service для запуска один раз в день

Чтобы автоматизировать задачу ежедневной работы хранимой процедуры, я написал службу Windows. Я запланировал свою задачу в Service1.cs следующим образом:

System.Timers.Timer oTimer = null; 

public ServiceExample() 
{ 
    InitializeComponent(); 
    oTimer = new System.Timers.Timer(); 
    SetTimer(); 
} 

private void SetTimer() 
{ 
    DateTime currentTime = DateTime.Now; 
    int intervalToElapse = 0; 
    DateTime scheduleTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 8, 0, 0); //run at 8 am every morning 

    if (currentTime <= scheduleTime) 
     intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds; 
    else 
     intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds; 

    oTimer = new System.Timers.Timer(intervalToElapse); 
    oTimer.Elapsed += new System.Timers.ElapsedEventHandler(oTimer_Elapsed); 

    oTimer.Start(); 
} 

void oTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    //make connection to SQL and call the SP 
    DBLibrary oDBLibrary = new DBLibrary(); 
    DataSet dsCustomer = oDBLibrary.getCustomerDetails(); 
    oTimer.Interval = (24 * 60 * 60 * 1000); 
} 

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

protected override void OnStop() 
{ 
    oTimer.Stop(); 
} 

Вызов хранимой процедуры заключается в следующем:

public DataSet getCustomerDetails() 
{ 
    DateTime First_Date = DateTime.Now; 
    DateTime dateOnly = First_Date.Date; 
    DateTime First_Date1 = dateOnly.AddDays(-1); // assign back to see the new instance 
    DateTime End_Date = DateTime.Now; 

    SqlConnection oSqlConnection = new SqlConnection(strConn); 
    oSqlConnection.Open(); 

    SqlCommand oSqlCommand = new SqlCommand(); 
    oSqlCommand.CommandTimeout = 0; 
    oSqlCommand.CommandType = CommandType.StoredProcedure; 
    oSqlCommand.CommandText = "Daily_Airtime_Summary"; 

    oSqlCommand.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)).Value = First_Date1; 
    oSqlCommand.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.DateTime)).Value = End_Date; 
    oSqlCommand.Connection = oSqlConnection; 

    DataSet ds = new DataSet(); 
    SqlDataAdapter oSqlDataAdapter = new SqlDataAdapter(oSqlCommand); 
    oSqlDataAdapter.Fill(ds); 

    oSqlConnection.Close(); 
    return ds; 
} 

Проблемы я столкнулся:

  1. Даже несмотря на то, запланированное время 8 утра, и я отлаживаю свою службу примерно в 10 утра, она начинает запускаться (выполнять хранимую процедуру) немедленно.
  2. Идея состоит в том, чтобы вызвать/запустить хранимую процедуру once. Однако, когда я проверяю table B, я вижу, что те же данные заполняются почти 17 раз.
  3. Даты, прошедшие в параметрах: start date = yesterday's date и end date = today's date. Тем не менее, я вижу, что процедура выполняется непрерывно, принимая start date = today's date после того, как дата с start date = yesterday's date и end date = today's date была выбрана (несколько раз).

Может ли кто-нибудь здесь посоветовать?

+0

Ваши параметры не зависят от данных вашей службы, поэтому вы можете просто создать задание на SQL Server. –

+0

Где вы отслеживаете, был ли вызов выполнен в течение определенного дня или нет? Вам нужно как-то хранить эту информацию где-то и проверить ее ... также: если вы запускаете это только один раз в день, я бы не столкнулся с проблемой создания службы - просто создайте ** консольное приложение **, которое вы может планировать использование запланированных задач Windows для запуска один раз в день .... намного проще ... –

+0

@marc_s Я рассмотрю ** консольное приложение **, но на данный момент я хочу, чтобы это работало в первую очередь. Мой вопрос: почему хранимая процедура вызывается несколько раз в одном экземпляре вместо того, чтобы служба «спала» после того, как хранимая процедура была выполнена? – Sarah

ответ

0

Проверьте свою логику времени, чтобы запустить proc. Это может быть неправильно инициализировано, что приводит к торренту proc при первом запуске.

Кроме того, чтобы отладить это, вам необходимо установить его как услугу с помощью. Чистая утилита, которая указывает исполняемый файл службы на версию отладки в вашем проекте. Соблюдайте в режиме отладки, запустите службу с помощью служебной программы Windows на панели управления, а затем в Visual Studio присоедините к этому процессу.

Смежные вопросы