【问题标题】:How to trigger a function according to database after a given time?如何在给定时间后根据数据库触发功能?
【发布时间】:2019-12-03 05:47:06
【问题描述】:

我正在开发一个 winforms/数据库软件。这是一个办公室里的每个人都可以使用的软件,使用相同的数据库。有一列包含任务的“日期时间”。这个任务还有一个延迟时间,我想做的是,如果今天的日期大于datetime + delaytime,程序应该触发sendMail()函数。如何触发这个功能,它应该是用户独立的?

void sendMail(string taskid, string subject, string message)
{

    try
    {

        SqlCommand komut = new SqlCommand();
        komut.CommandText = "select planner from db_owner.tbl_SpecificTask where TASKID = @taskid";
        komut.Parameters.AddWithValue("@taskid", TASKID);
        komut.Connection = Db.Db;
        komut.CommandType = CommandType.Text;
        SqlDataReader dr = komut.ExecuteReader();
        while (dr.Read())
        {

            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient();
            mail.To.Add(dr[0].ToString());
            //mail.To.Add(dr[1].ToString());
            mail.From = new MailAddress("task.notification@tr.companyA.com");
            mail.Subject = subject;
            mail.IsBodyHtml = true;
            mail.Body = message;
            SmtpServer.Host = "hiddeninfo";
            SmtpServer.Port = hiddeninfo;
            SmtpServer.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
            try
            {
                SmtpServer.Send(mail);

            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception Message: " + ex.Message);
                if (ex.InnerException != null)
                    Debug.WriteLine("Exception Inner:   " + ex.InnerException);
            }

        }


    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex);
    }
    finally
    {
        Db.Close();
    }

}

【问题讨论】:

  • 你有没有想过运行一个服务来检查数据库并在条件为真时运行任务。
  • @MarcusLai 不,我想不通。我不知道应该从哪里开始运行该服务
  • 也许这会有所帮助...stackoverflow.com/questions/23440749/…
  • 您想从特定工作站发送电子邮件,还是只是一封电子邮件,通知是否发生了某事并且可以由所有人发送?
  • @AthanasiosKataras 如果我给出的条件发生,程序应该向存储在数据库中的所有人发送电子邮件..

标签: c# sql winforms triggers


【解决方案1】:

这不应该是 WinForms 应用程序的责任。为什么?

  1. 需要协调。如果两个或更多本地应用程序尝试发送电子邮件,应该由谁来做?
  2. 与单个实例相比,它将花费更多的计算时间(与客户端一样多)。
  3. db 会被疯狂打击

那你能做什么。实际上有几件事。

假设服务层。

如果您的应用程序通过 WebApi 等服务层进行通信,则它们是工作进程。 Running a background thread on a RESTful WebApi request 这可能会有所帮助。

假设应用程序直接与数据库对话。

在服务器上创建新服务。请注意,我没有明确说数据库服务器,因为它可能无法访问互联网,但本质上是一个 Web 服务器,它没有停机时间。

按照这样的教程创建服务:https://docs.microsoft.com/en-us/dotnet/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer。这个例子甚至像你一样轮询。

将原生应用与调度程序结合使用

您可以构建一个 Windows 应用程序并使用 Windows 调度程序调用。如果您的应用程序是 .net 核心,您甚至可以使用 cron 作业从 linux 机器调用

【讨论】:

  • 谢谢你的解释,for 1;数据库应该触发这个功能,它不会是用户驱动的,因此我认为不需要协调。你对其他人的看法也是对的,但是我的时间有限,软件也快准备好了。
  • 如果必须在 WinForm 中进行,请查看 docs.microsoft.com/en-us/dotnet/api/… 。它不需要从按钮启动。不过要注意上面提到的三点。运行 sql 的方式,确保行被锁定,这样您就不必在客户端之间进行任何协调。
猜你喜欢
  • 2018-11-22
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2014-11-15
  • 2014-11-20
  • 1970-01-01
相关资源
最近更新 更多