我正在尝试将我在数据库中的信息放入列表中,因此它可以将数据库中指定的时间与现在的时间进行比较并显示通知。
到目前为止还没有完全正常工作,我觉得我走在正确的轨道上,有人可以看看我的代码吗?
private void timer1_Tick(object sender, EventArgs e)
{
try
{
DataTable dt = new DataTable();
SqlDataAdapter sqlDA = new SqlDataAdapter("SELECT Time FROM dbo.Planner", connectionString);
sqlDA.Fill(dt);
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
List<string> Time = new List<string>();
if (dt.Rows.Count >= 0)
{
foreach (DataRow item in dt.Rows)
{
Time.Add(item["Time"].ToString());
Console.WriteLine(item[1]);
}
foreach (string item in Time)
{
if (item == DateTime.Now.ToString("HH:mm"))
{
MessageBox.Show("Test");
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
答案 0 :(得分:1)
使用对象的.ToString()
方法通常可以显示我们认为“匹配”的结果,但计算机则不会。这是有风险的,特别是如果数据库有填充字段或者您正在寻找“:”但该字段实际上是秒数或者是Julian日期。
相反,我建议您比较两个DateTime
个对象。希望你回来的文字能够干净利落:
foreach (string item in Time)
{
var n = Convert.ToDateTime(item);
if (n.ToString("HH:mm") == DateTime.Now.ToString("HH:mm"))
{
MessageBox.Show("Test");
}
}
现在我有两个比较对象,我可以确保给出完全相同的字符串格式来表示一小时一分钟。不过,有更好的方法可以做到这一点。
if (n.Hour == DateTime.Now.Hour && n.Minute == DateTime.Now.Minute)
{
MessageBox.Show("Test");
}
如果你可以用这种方式进行比较而不是乱用字符串,那么它总是更好。
答案 1 :(得分:0)
我觉得这样的东西适合(导入system.data.linq),每分钟启动一次检查(关于所需的精度):
public IEnumerable<DateTime> DateTimes()
{
using(DataContext dc = new DataContext("constring"))
{
return dc.ExecuteQuery<DateTime>("SELECT Time FROM dbo.Planner");
}
}
public void Check()
{
foreach(var dateTime in DateTimes())
{
if(dateTime.Minute==DateTime.Now.Minute && dateTime.Hour == DateTime.Now.Hour)
{
MessageBox.Show("Notification");
}
}
}