2012-09-17 24 views
0

我正在爲圖書館建立一個網站,如果有人需要在接下來的五天內退還書籍並通過電子郵件向他們發送提醒,我需要每天同時檢查一次。如何在特定時間通過C#運行SQL存儲過程?

我的問題是什麼才能做到這一點的正確方法?

我需要完成的是當一天中的特定時間到來時,我需要運行一個sql存儲過程,並通過visual studio 2010或其他任何方式檢查存儲過程是否已返回任何需要發送電子郵件的結果。

有沒有辦法在C#上不斷檢查系統時間,而不是觸發事件?

+2

看看這個答案 - 它不是通過C#,但它會更簡單地通過SQL作業 - http://stackoverflow.com/questions/5471080/how-to-schedule-a-job-for- sql-query-to-run-daily – InSane

+0

正如Ted建議的,SQL Server Agent是最好的方法。你如何做電子郵件將是另一回事。這可以在SQL Server中完成,或者您可能希望使用命令行SMTP郵件程序(如blat)。 –

+0

謝謝你。似乎運行查詢不是一個問題,但我如何使用從sp收集的數據? – yishai

回答

1

我倒是像這樣做將是每天在SQL Server代理創建新任務調用存儲過程,而不是試圖在你編寫的應用程序實現這一目標的最簡單方法。

查看creating SQL Jobs

編輯以下鏈接瞭解更多信息 - 對不起,我真的不應該嘗試SO回答的帖子,在做其他工作了。我完全錯過了你想發送電子郵件的事實,並且想到了你想要在屏幕上報告逾期記錄的想法。咄。

要在每天的特定時間發送過期的電子郵件,我猜想一個Windows服務肯定會完成這項工作,但看起來有點過頭了,你需要完全控制它的服務器正在運行。

您可以改爲建立一個計劃任務,每天調用sendOverdueMail.aspx網頁做的工作吧? Like this

很明顯,還有SQL Server Agent電子郵件選項,儘管我不確定對電子郵件的格式有多少控制。

最後,this tutorial通過掛接到ASP.net服務器上的緩存過期事件來創建計劃任務類型效果,然後允許您調用電子郵件代碼。

private const string DummyCacheItemKey = "GagaGuguGigi"; 
protected void Application_Start(Object sender, EventArgs e) 
{ 
    RegisterCacheEntry(); 
} 

private bool RegisterCacheEntry() 
{ 
    if(null != HttpContext.Current.Cache[ DummyCacheItemKey ]) return false; 

     HttpContext.Current.Cache.Add(DummyCacheItemKey, "Test", null, 
     DateTime.MaxValue, TimeSpan.FromMinutes(1), 
     CacheItemPriority.Normal, 
     new CacheItemRemovedCallback(CacheItemRemovedCallback)); 

    return true; 
} 


public void CacheItemRemovedCallback(string key, 
     object value, CacheItemRemovedReason reason) 
{ 
    Debug.WriteLine("Cache item callback: " + DateTime.Now.ToString()); 

    // send reminder emails here 
    DoWork(); 
} 
+1

而且您還可以直接從SQL Server引擎發送電子郵件(查找數據庫郵件) –

+0

謝謝。我如何使用通過代理獲得的結果?在我運行它之後,我想處理結果以供進一步使用,例如發送電子郵件。 – yishai

0

要比較日期,請使用T-SQL中的DATEDIFF函數。例如,您有一個包含行ID,圖書名稱,學生姓名,借用日期和到期日期的表格。借用日期和到期日期都有DateTime類型。

以查詢x天數量的書籍;這是根據自己的規範5天,這樣

SELECT行ID,BOOKNAME,StudentName,DateBorrowed,DUEDATE查詢FROM dbo.Borrowers WHERE DATEDIFF(日,DateBorrowed,DUEDATE)> = 5

這將查詢所有書都應提醒。

然後使用一個SQL查詢工作,以觸發將追加到將包含誰需要提醒學生的電子郵件列表中的另一表中的動作。可以從將使用該列表的Windows服務讀取該表作爲電子郵件隊列。或者,您可以將SQL配置爲直接發送電子郵件。

0

使用Windows計劃任務調用網站網頁,做運行存儲過程和發送郵件的任務。

在C#中沒有具體的方法,雖然它會給你這樣的結果。

如果您無法訪問計劃任務或者無法運行Windows服務,即您擁有共享主機,那麼還有另一種選擇。

有服務可用於監視我們的網站的正常運行時間。他們定期提出要求。您可以使用此請求來完成您的任務。 某些鏈接在這裏

Site uptime

Pingdom

給我用他們幾次,他們是非常可靠的。最重要的是,他們不要求您在系統上擁有管理員訪問權限來執行計劃任務。

+0

我一般不喜歡這種情況,原因很簡單,因爲Task Scheduler服務本身偶爾會失敗... –

+0

@RobbieDee您能否解釋一下Task Scheduler如何失敗? – WTFZane

+0

@WTFZane任務計劃程序作爲服務運行。如果這崩潰(正如我看到的那樣)或停止,那麼計劃任務將不會運行。 –

相關問題