【发布时间】:2014-03-12 16:56:13
【问题描述】:
我想问当当前日期和时间达到记录删除数据库中存储的日期时间时,如何自动从数据库中删除项目?
【问题讨论】:
-
如果你使用的是sql server,你最简单的解决办法是设置一个定时作业是sql server
-
Revalee 开源项目可以帮助您解决这个问题。
标签: c# sql .net asp.net-mvc entity-framework
我想问当当前日期和时间达到记录删除数据库中存储的日期时间时,如何自动从数据库中删除项目?
【问题讨论】:
标签: c# sql .net asp.net-mvc entity-framework
由于您已使用 ASP.NET MVC 和 Entity Framework 对此进行了标记,因此我不确定您是否有权访问底层数据库服务器。但如果这样做,您的 ASP.NET 应用程序就不是执行此操作的最佳位置。而是在后端服务器上设置一个 SQL Server 代理作业,该作业可以按指定的时间间隔运行并运行 DELETE 查询。
创建一个类似这样的存储过程:
CREATE PROCEDURE dbo.DeleteOnSchedule
AS
BEGIN
DELETE [dbo].[Table]
WHERE [DateTimeToDelete] <= CURRENT_TIMESTAMP;
END
然后按计划运行该过程。
【讨论】:
正如其他用户指出的那样,使用 ASP.Net 这样做并不理想。您最好设置作业或计划任务。
话虽如此,我知道这并不总是可能的,所以如果你真的需要,你可以采取另一条路线-
这里有关于如何设置的描述- https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
基本上你只是使用缓存过期来触发代码执行。您可以简单地将删除逻辑添加到回调中,以定期清除旧记录。虽然这是一个 hack,所以我将它作为最后的手段。
【讨论】:
您可以通过创建一个 .NET 计时器来执行此操作,该计时器可以检查您想要的任何内容并运行删除代码,例如在 5 分钟后删除未确认的用户。
public static class DeleteEmployerTimer
{
static private JobsEntities JobDatabase=new JobsEntities();
private static Timer threadingTimer;
public static void StartTimer()
{
if (threadingTimer==null)
{
//raise timer callback every 5 minutes
threadingTimer = new Timer(new TimerCallback(CheckData),
HttpContext.Current, 5 * 60000, 5 * 60000);
}
}
private static void CheckData(object sender)
{
MembershipUserCollection AllEmployer = Membership.GetAllUsers();
foreach (MembershipUser Employer in AllEmployer)
{
//your condition to delete records (it can be everything you want date, specific data in config file)
if(!Employer.IsApproved)
{
MeWork.Domain.Database.Employer FindedEmployer = JobDatabase.Employer.Find(Employer.ProviderUserKey);
JobDatabase.Employer.Remove(FindedEmployer);
JobDatabase.SaveChanges();
Membership.DeleteUser(Employer.UserName, true);
}
}
}
}
在应用启动时创建计时器
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
....
//Create timer
DeleteEmployerTimer.StartTimer();
}
}
【讨论】: