我现在正在为图书馆建立一个网站,我需要每天同时检查是否有人需要在接下来的五天内还书并通过电子邮件向他们发送提醒。
我的问题是正确的方法是什么?
我需要完成的是,当一天中的特定时间到来时,我需要运行一个 sql 存储过程,并通过 Visual Studio 2010 或任何其他方式检查存储过程是否返回了我需要通过电子邮件发送的任何结果。
有没有办法在 C# 上不断检查系统时间而不是作为触发事件?
我现在正在为图书馆建立一个网站,我需要每天同时检查是否有人需要在接下来的五天内还书并通过电子邮件向他们发送提醒。
我的问题是正确的方法是什么?
我需要完成的是,当一天中的特定时间到来时,我需要运行一个 sql 存储过程,并通过 Visual Studio 2010 或任何其他方式检查存储过程是否返回了我需要通过电子邮件发送的任何结果。
有没有办法在 C# 上不断检查系统时间而不是作为触发事件?
我想最简单的方法是在 SQL Server 代理中创建一个新作业来每天调用您的存储过程,而不是尝试在您编写的应用程序中实现这一点。
有关创建 SQL 作业的更多信息,请参阅以下链接
编辑 -对不起,我真的不应该在做其他工作的同时尝试回答 SO 帖子。我完全错过了你想发送电子邮件的事实,并让我想到你想在屏幕上报告逾期记录。呃。
要在每天的某个时间发送过期的电子邮件,我猜 Windows 服务肯定会完成这项工作,但似乎有点过头了,你需要完全控制它运行的服务器。
您可以改为设置一个计划任务来每天调用一个 sendOverdueMail.aspx 网页来完成这项工作?像这样
显然也有 SQL Server 代理电子邮件选项,尽管我不确定您对将产生的电子邮件格式有多少控制权。
最后,本教程通过挂钩到 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();
}
要比较日期,请使用 T-SQL 中的 DATEDIFF 函数。例如,您有一个表,其中包含行 ID、书名、学生姓名、借阅日期和到期日期。借用日期和到期日期都有 DateTime 类型。
查询 x 天到期的书籍;根据您的规范,这是 5 天,这样查询
从 dbo.Borrowers WHERE DATEDIFF(day, DateBorrowed, DueDate) >= 5 中选择 RowID、BookName、StudentName、DateBorrowed、DueDate
这将查询所有到期提醒的书籍。
然后使用 SQL 查询作业触发将附加到另一个表的操作,该表将包含需要提醒的学生的电子邮件列表。可以从将使用该列表作为电子邮件队列的 Windows 服务读取此表。或者,您可以将 SQL 配置为直接发送电子邮件。