数据库日期时间字段上的Fire事件

时间:2016-06-25 12:06:47

标签: c# sql-server datetime events

我在数据库中有这样的表:

test

在表格中的事件字段时,在某处(在SQL Server数据库或c#应用程序中)实现事件触发器的最佳方法是什么。

编辑:

传统上我会做这样的事情:

while(true)
{
  DataTable tbl = getRows("select * from table where event=" + DateTime.now());
  if(tbl.rows.Count()>0)
   {
     //do some thing
   }
 Thread.Sleep(1000);
}

有没有更有效的方法来实现这一目标? (我不想定期检查数据库)

2 个答案:

答案 0 :(得分:0)

我会这样:

public class Notify
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime Time { get; set; }
}

public Timer tData = new Timer();
public List<Notify> Notifications = new List<Notify>();

public void Main()
{
    // 5 minutes
    tData.Interval = 1000;
    tData.Tick += new EventHandler(CheckEvents);
}

public void GetAllEvents()
{
    DataTable results = new DataTable();
    /* results = YourDatabase(Select id, name, event FROM...); */

    Notifications.Clear();

    foreach(DataRow row in results.Rows)
    {
        Notifications.Add
        (
            new Notify
            {
                ID = int.Parse(row[0].ToString()),
                Name = row[1].ToString(),
                Time = DateTime.Parse(row[2].ToString())
            }
        );
    }
}

public void CheckEvents(object sender, EventArgs e)
{
    IEnumerable<Notify> eventsElapsed = Notifications.Where(notify => notify.Time == DateTime.Now);

    foreach(Notify notify in eventsElapsed)
    {
        // Send your sms
        var id = notify.ID;
        var name = notify.Name;
        var time = notify.Time;
    }
}

待办事项:

  • 从数据库中获取DateTime时需要注意正确的格式。它可能看起来不同。

  • 你必须考虑如何获得新事件。我可以通过按下按钮或设置另一个计时器,间隔大约5-10分钟。您只需致电GetAllEvents()

我不认为你正在插入新的事件,这些事件会在接下来的30秒内显示出来。

另一种更高级的方式:

你也可以为此设置2个应用程序。

第一个应用:

  • 从数据库中获取所有活动
  • (可选)创建一个允许过滤哪些事件的用户界面
  • 使用secondApp.exe "2016-06-26 10:13:56"
  • 等起始参数将每个事件链接到Scheduled Tasks

第二个应用:

  • 启动时,获取传递的参数并发送短信。

如果你的桌子有很多数据,那么从发送短信(第二个应用程序)的简单过程中分割耗时的事件(第一个应用程序)的过程就不错了。

答案 1 :(得分:0)

为此目的,不要在数据库中弄乱trigger

在C#中,您可以编写逻辑代码 - 您需要完成的事情。接下来指定一个存储输入参数的对象+启动该逻辑的时间。例如。在SMS系统中,我们需要用户号码,信息和发送时间。

在系统启动时(例如),您可以读取数据以获取时间。启动一些线程并让它们等待(Sleep),只要需要,然后执行目标方法。像这样:

class SmsDetails
{
    public string Subscriber { get; set; }

    public string Message { get; set; }

    public DateTime SendOn { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        SqlDataReader schedule = null; // Initialize the reader as appropriate.

        while (schedule.Read())
        {
            var det = new SmsDetails();
            //.
            //.
            //.
            det.SendOn = schedule.GetDateTime(2);
            ThreadPool.QueueUserWorkItem(ScheduleSending, det);
        }

    }

    static void ScheduleSending(object Details)
    {
        var smsd = Details as SmsDetails;

        if (smsd.SendOn > DateTime.Now)
        {
            var waitInterval = DateTime.Now - smsd.SendOn;
            Thread.Sleep(waitInterval);
            SendSms(smsd.Subscriber, smsd.Message);
        }
    }

    static void SendSms(string PhoneNumber, string Message)
    {
        // Send it out
    }
}

当然这不是这种解决方案的完整代码,但我希望你能得到这个想法。如果邮件已发送,您需要注意(在数据库中?)。您还可以使用等待句柄来中断调用代码中的线程。 根据阅读器中记录的数量,您可能需要轮询数据库以查找要在下一个,6,12等中发送的消息。例如。如果您需要在接下来的3天内发送10000封邮件,请立即安排。线程太多会降低性能。