【问题标题】:C# get appointment from database based on DateTime value and idC# 根据 DateTime 值和 id 从数据库中获取约会
【发布时间】:2016-06-20 09:16:19
【问题描述】:

我的 WinForm 上有一个月历。当用户单击某个日期时,我想检查该用户在他单击的那一天是否存在约会,然后显示一些信息。我使用 MySql 连接器在 MySql 数据库中检查此信息。我目前在 Gebruiker_has_Afspraak 表中检查与用户 ID 对应的约会 ID,然后在 Afspraak 表中检查与月历上单击的日期相同的日期。如果相同,它将返回约会的位置(将来有更多信息)。

我有这个代码:

 public List<string> checkAfspraakDate(DateTime datum, string type, string id)
    {
        List<string> result = new List<string>();
        List<string> result1 = new List<string>();
        if (this.openConnection() == true)
        {
            //Afspraak_id ophalen uit Gebruiker_has_afspraak
            string query = "SELECT Afspraak_id FROM Gebruiker_has_Afspraak WHERE Gebruiker_id = '" + id + "' ";
            MySqlCommand cmd = new MySqlCommand(query, connection);
            cmd.CommandType = CommandType.Text;
            using (MySqlDataReader reader = cmd.ExecuteReader())
            {
              while (reader.Read())
              {
                result.Add(reader.GetString(0));
              }

              reader.Close();
            }
            cmd.Cancel();
            //Afspraak gegevens uit table halen | Gebaseerd op Afspraak_id^ en datum_today
            foreach (string item in result)
            {
                query = "SELECT afspraak_locatie FROM Afspraak WHERE id = '" + item + "' AND datum = '" + datum +"'";
                MySqlCommand cmd1 = new MySqlCommand(query, connection);
                cmd1.CommandType = CommandType.Text;
                using (MySqlDataReader reader1 = cmd1.ExecuteReader())
                {
                    while (reader1.Read())
                    {
                        result1.Add(reader1.GetString(0));
                    }

                    reader1.Close();
                }
                cmd1.Cancel();
            }
            return result1;

        }
        else
        {
            return result;
        }
    }

如果当前用户 ID 与表中的用户 ID 匹配,则第一个代码将从表“Gebruiker_has_Afspraak”中提取“Afspraak_id”。

然后,“Afspraak_id”将用于检查“Afspraak”表中的约会,其中日期 == 月历上单击的日期。

我目前正在尝试将 DateTime 对象与数据库中的日期进行比较,因为数据库中的日期存储为日期时间值。 我也用字符串尝试过,但也没有用。我在“while(reader1.Read())”部分得到了一个 system.NullReferenceException。我认为这是因为我从数据库中得到了一个空值,但这是不对的,因为几乎所有日期都有约会。

【问题讨论】:

  • 不要连接字符串来创建查询,这样很容易受到 SQL 注入的攻击。
  • id和日期不是用户填写的,而是基于点击的,所以这里注入不是问题。
  • 我仍然会使用参数而不是串联。如果只是为了清楚。

标签: c# mysql datetime nullreferenceexception


【解决方案1】:

由于您将 C# DateTime 对象与字符串连接起来,这将导致在对象上调用默认的 .ToString()。这取决于它所运行的电脑/服务器的文化,以返回它的格式。

由于 MySQL 的格式为 YYYY-MM-DD HH:MM:SS,这可能会有所不同,因此不会导致匹配。您需要致电datum.ToString("yyyy-MM-dd HH:mm:ss")

请记住,您的检查还会检查到秒数的日期是否匹配,您可能只想检查日期部分。

【讨论】:

  • 我刚刚发现确实如此,我在数据库中的格式是 yyyy-MM-dd HH:mm:ss 但我的数据变量有 dd-MM-yyyy HH:mm:ss 我可以解析它们或以正确的顺序串起来。但我想检查一整天,所以如果我检查一天,我的数据库是否会接受如果我忽略小时、分钟和秒?
  • 示例我检查 yyyy-MM-dd 但数据库有 yyyy-MM-dd HH:mm:ss 查询是否有效?
  • @GertjanBrouwer This question 回答那部分。您必须将 mysql 日期时间转换为日期才能忽略时间部分
  • 但我仍然需要时间来正确显示我的约会 - 我应该使用额外的字段吗?
  • 哦,没关系,我可以选择日期并基于 date()
猜你喜欢
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多