C# 如何拥有数据库触发器代码

C# 如何拥有数据库触发器代码,c#,sql-server,asp.net-mvc,linq,C#,Sql Server,Asp.net Mvc,Linq,我需要一些帮助 这个表中有一个日期列,当该列中的任何日期等于服务器日期时,我需要告诉我的网站/程序发送电子邮件或执行某些通知操作,以让用户知道一些事情 我曾考虑在服务器上运行一个程序,每隔一定时间轮询数据库,但问题是,如果日期是11月1日上午10:30,而我的时间间隔是每5分钟一次,则轮询可能不准确,即上午10:35轮询。换句话说,我需要数据库以某种方式在“x”日期正好在该日期时通知某些内容 我希望避免以1秒的间隔检查数据库,因为我认为这会对性能造成巨大的影响 我正在使用ASP.NETMVC3M

我需要一些帮助

这个表中有一个日期列,当该列中的任何日期等于服务器日期时,我需要告诉我的网站/程序发送电子邮件或执行某些通知操作,以让用户知道一些事情

我曾考虑在服务器上运行一个程序,每隔一定时间轮询数据库,但问题是,如果日期是11月1日上午10:30,而我的时间间隔是每5分钟一次,则轮询可能不准确,即上午10:35轮询。换句话说,我需要数据库以某种方式在“x”日期正好在该日期时通知某些内容

我希望避免以1秒的间隔检查数据库,因为我认为这会对性能造成巨大的影响

我正在使用ASP.NETMVC3MSSQL和LINQ实体框架


有什么创意吗?

你可以用它来设置这些活动。石英是非常灵活和强大的-它是为这类事情

不要让数据库触发代码。让触发器在另一个表中创建一行,其中包含刚刚发生的事情的信息


有一个单独的程序,定期从第二个表中读取数据,发送给电子邮件用户或您需要执行的任何操作。让该程序在处理完电子邮件后从表中删除该行。

我没有任何个人经验,但Sql Server CLR集成可能是您想要的答案。从描述中可以看出,您几乎可以编写任何针对.NET framework编译的内容,并将其部署到sql server实例,sql server将能够执行它

您要么需要使用调度器(例如Oracle或SQL Server作业中的DBMS_调度器等),要么找到其他响应者提到的第三方工具,如Quartz.net。或者在投票应用程序中编写如下代码

 select all jobs due in next 5 minutes, order by due date
 while there are jobs
    if the next job is due action it
    else sleep for duration of interval till job due
 loop

这是有点脏,但我认为它会给你的功能,你正在寻找

在Global.asax.cs中

public DateTime LastMaxDateTime;

protected void Application_Start(object sender,EventArgs e)
{
    LastMaxDateTime = GetMaxDateTime();

    Thread bgThread=new Thread(BackgroundThread_CheckDatabase);
    bgThread.IsBackground=true;
    bgThread.Start();
}

private void BackgroundThread_CheckDatabase()
{
    while(true)
    {
        DateTime dtMaxDateTime = GetMaxDateTime();
        if(dtMaxDateTime > this.LastMaxDateTime)
        {
            //Send Notifications
            this.LastMaxDateTime=dtMaxDateTime;
        }

        Thread.Sleep(5000); //5 seconds
    }
}

private DateTime GetMaxDateTime()
{
     //function that returns DateTime from something like "SELECT MAX(DateTimeColumn) FROM [MyTable]"
}

基本上,代码跟踪表中最新的日期时间,并在每次轮询时检查数据库中是否有自上次检查以来更新的日期时间。如果是这样,您可以发送通知。如果您不希望表中有太多可能导致争用情况的记录,那么我不认为这是一个快速解决方案。

最有效的方法是让应用程序运行事件驱动而不是轮询


例如,让一个线程在数据库中查询最早的计划事件,并在此之前一直休眠。然后让另一个线程同步等待表更改(例如,在PostgreSQL中,这将是
NOTIFY
/
LISTEN
语句),并向第一个线程发出信号,以检查最早的事件是否已更改。

最简单的方法是跟踪上次检查的日期。再次检查时,将所有大于上次检查日期且小于或等于新检查日期的行拉入。为了确保执行它们,您可以为执行操作的时间添加一列并更新该列。如果在新列上有一个索引,则每秒检查该索引中是否有执行日期为NULL的行,就不会有任何性能问题


您还可以提前阅读并按触发日期对即将到来的项目进行排序,然后执行一个线程。等待()直到下一个项目出现,以便更精确。

您能更具体一些吗?我不认为这能解决他的问题。对不起,quartz是一个作业调度框架。您可以通过相应的任务(向某人发送电子邮件)向Quartz注册这些日期/时间。Quartz基本上是cron的工作NETI我来看看。。将需要一点时间来实现,但它看起来很像我想做的,这与只检查表中的日期有什么不同?有触发器不允许我执行实际的C#code@Ryan:您关心的似乎是在正确的时间执行代码。触发器只会在正确的时间在“触发器表”中创建一行。然后,当该行出现在“触发器表”中时,C代码可以轮询或使用通知执行。请参阅“”。@John-Ohh确定轮询是不可能的,但我必须查看通知。。唯一的问题是,它看起来不能与SQL一起使用express@John-我很难找到一个像样的地方开始工作。我正在使用实体框架来处理数据库相关的东西。。有什么好的链接吗?@Ryan:你有什么问题?ADO.NET的东西?