我正在为图书馆建立一个网站,如果有人需要在接下来的五天内退回书籍并通过电子邮件向他们发送提醒,我需要每天同时查看。
我的问题是这样做的正确方法是什么?
我需要完成的是当特定时间到来时我需要运行sql存储过程并通过visual studio 2010或任何其他方式检查存储过程是否已返回我需要发送电子邮件的任何结果。
有没有办法可以在C#上不断检查系统时间而不是作为触发事件?
答案 0 :(得分:1)
我想映像最简单的方法是在SQL Server代理中创建一个新作业,每天调用你的存储过程,而不是试图在你编写的应用程序中实现这一点。
的更多信息,请参阅以下链接编辑 - 抱歉,我也不应该在做其他工作时尝试回复SO帖子。我完全错过了你想发送电子邮件的事实,并且想要在屏幕上报告过期记录。咄。
要在每天的某个特定时间发送过期电子邮件,我猜一个Windows服务肯定会完成这项工作,但似乎有点过头,你需要完全控制它正在运行的服务器上。
你可以设置一个计划任务来每天调用sendOverdueMail.aspx网页来做这项工作吗? Like this
显然还有SQL Server代理的电子邮件选项,虽然我不确定你对将产生的电子邮件格式有多少控制权。
最后,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 :(得分:0)
比较日期,使用T-SQL中的DATEDIFF函数。例如,您有一个包含行ID,书名,学生姓名,借用日期和截止日期的表格。借用日期和截止日期都有DateTime类型。
查询x天数的书籍;根据您的规格,这是5天,查询如下
SELECT RowID,BookName,StudentName,DateBorrowed,DueDate FROM dbo.Borrowers WHERE DATEDIFF(day,DateBorrowed,DueDate)> = 5
这将查询所有应提醒的图书。
然后使用SQL查询作业触发将附加到另一个表的操作,该表将包含需要提醒的学生的电子邮件列表。可以从将使用该列表作为电子邮件队列的Windows服务读取此表。或者,您可以将SQL配置为直接发送电子邮件。
答案 2 :(得分:0)
使用Windows计划任务调用执行运行存储过程和发送邮件任务的网站页面。
C#中没有特定的方法可以提供这样的结果。
如果您无法访问计划任务,或者无法运行Windows服务,即您拥有共享主机,则还有另一种选择。
有些服务可用于监控我们网站的正常运行时间。他们定期提出要求。您可以使用此请求执行任务。 这里给出了一些链接
我已经多次使用它们,它们非常可靠。最重要的是,它们不要求您在系统上具有管理员访问权限以执行计划任务。