【问题标题】:Database into a list collection数据库到列表集合
【发布时间】:2017-01-05 15:23:18
【问题描述】:

我正在尝试将我在数据库中的信息放入一个列表中,以便它可以将数据库中指定的时间与现在的时间进行比较并显示通知。

到目前为止,它还没有完全工作,我觉得我在正确的轨道上,有人可以看看我的代码吗?

  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);
        }

    }

【问题讨论】:

  • “到目前为止,它还不能正常工作”。详细说明。
  • if (dt.Rows.Count &gt;= 0) 也应该是 &gt; 0 否则你会将空行放入你的 foreach 循环应该 .Count == 0
  • @rory.ap 我不确定代码是否正确,我什至可以用我的数据库中的数据填充我的列表吗?以及如何比较检查时间。
  • 运行代码的结果是什么?发生了什么你不喜欢的事情?
  • 你试过调试看看它在做什么吗?逐行遍历代码,观察变量的值?

标签: c# sql-server database winforms list


【解决方案1】:

使用对象的.ToString() 方法通常可以呈现我们认为“匹配”的结果,但计算机不会。这是有风险的,特别是如果数据库有填充字段或者您正在寻找“:”但该字段实际上是秒数或者是儒略日期。

相反,我建议您比较两个 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");
                }

如果您可以这样比较而不是乱用字符串,那么它总是更可取的。

【讨论】:

  • 这行得通!!!!非常感谢!,我还需要让它检查日期,所以它需要检查时间+日期。你也能帮我解决这个问题吗?这是我到目前为止日期pastebin.com/KxtqHp1E的代码
  • DateTime 有各种各样的方法来处理这类事情。您可以使用 .Day、.Month、.Year 等。我认为您可以使用:DateTime.ToShortDateString();这是一个字符串比较,但由于它将来自使用相同方法的两个日期时间对象,这很好。如果要在同一操作中比较日期和时间,只需将 DateTime n 与 DateTime.Now 进行比较,而不使用任何属性。
【解决方案2】:

我认为这样的东西适合(导入 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");
            }
        }
    }

【讨论】:

  • 这是什么答案?
  • 这个答案有什么问题? (我尽量是建设性的,而不是一个拖钓问题)
  • 这个答案的问题是我们甚至不知道OP在问什么,那么我们该如何回答呢?这不是一个通用的代码审查网站;一定有一个问题我们可以提供帮助。
  • 通过阅读他的代码,我认为他会尝试检查数据库是否有通知,如果有通知则显示一个消息框。我只是重写了他的尝试。
猜你喜欢
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多