我在数据库中有这样的表:
在表格中的事件字段时,在某处(在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);
}
有没有更有效的方法来实现这一目标? (我不想定期检查数据库)
答案 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"
第二个应用:
如果你的桌子有很多数据,那么从发送短信(第二个应用程序)的简单过程中分割耗时的事件(第一个应用程序)的过程就不错了。
答案 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封邮件,请立即安排。线程太多会降低性能。