У меня есть хранимая процедура, написанная на 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;
}
Проблемы я столкнулся:
- Даже несмотря на то, запланированное время 8 утра, и я отлаживаю свою службу примерно в 10 утра, она начинает запускаться (выполнять хранимую процедуру) немедленно.
- Идея состоит в том, чтобы вызвать/запустить хранимую процедуру
once
. Однако, когда я проверяюtable B
, я вижу, что те же данные заполняются почти 17 раз. - Даты, прошедшие в параметрах:
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
была выбрана (несколько раз).
Может ли кто-нибудь здесь посоветовать?
Ваши параметры не зависят от данных вашей службы, поэтому вы можете просто создать задание на SQL Server. –
Где вы отслеживаете, был ли вызов выполнен в течение определенного дня или нет? Вам нужно как-то хранить эту информацию где-то и проверить ее ... также: если вы запускаете это только один раз в день, я бы не столкнулся с проблемой создания службы - просто создайте ** консольное приложение **, которое вы может планировать использование запланированных задач Windows для запуска один раз в день .... намного проще ... –
@marc_s Я рассмотрю ** консольное приложение **, но на данный момент я хочу, чтобы это работало в первую очередь. Мой вопрос: почему хранимая процедура вызывается несколько раз в одном экземпляре вместо того, чтобы служба «спала» после того, как хранимая процедура была выполнена? – Sarah