【问题标题】:Why doesn't this WHERE clause return the right datums?为什么这个 WHERE 子句不返回正确的数据?
【发布时间】:2018-11-09 20:42:21
【问题描述】:

我正在尝试查询 .mdb 数据库,这是 VB.Net 中 SQL 的一部分:

sql = sql + "WHERE datdatum BETWEEN #" & "15-10-2018" & "# And #" & "31-10-2018" & "#"

where 子句按照您假设的方式工作。目前我将第一个日期从15-10-2018 更改为01-10-2018,它显示来自Jan-10 而不是Oct-01 的所有记录。

【问题讨论】:

  • 因为你没有使用参数。千万不要这样写 sql,即使在实践中也是如此。
  • 问题得到修复后,将返回 31 至 10 日午夜之前的记录,但不会在当天晚些时候返回。使用

标签: sql vb.net ms-access


【解决方案1】:

这里有两个问题。

首先,不要这样格式化日期。用于 SQL 的日期应该始终使用ISO8601 格式。对于没有时间组件的仅日期值,有一些理由更喜欢标准格式的鲜为人知的未分隔变体,但这仍然是 ISO8601。所以日期值应该是这样的:

sql = sql + "WHERE datdatum BETWEEN #" & "20181015" & "# And #" & "20181031" & "#"

或者这个:

sql = sql + "WHERE datdatum BETWEEN #" & "2018-10-15" & "# And #" & "2018-10-31" & "#"

其他任何问题都只是在乞求您的问题中的那种问题,其中从字符串中读取的实际日期因做出解释的人/设备的文化而异。

此修复可能似乎可以自行解决,但由于第二个问题,我们仍然需要做更多的工作:

不要使用字符串连接将数据放入 SQL 查询中!

您应该始终像这样构建查询:

sql = sql + " WHERE datdatum BETWEEN ? And ?"

连接是可以的,只要不使用数据,例如日期值。然后你填充这样的值(假设你有一个名为 cmdOleDbCommand 对象):

cmd.Parameters.Add("?", OleDbType.Date).Value = DateTime.Parse("2018-10-15")
cmd.Parameters.Add("?", OleDbType.Date).Value = DateTime.Parse("2018-10-31")

这完全避免了问题中的格式问题,因为您使用的是 .Net DateTime 值。它有时可以运行得更快(尽管对于 Access 可能无关紧要)。它还可以防止恶意和良性 SQL 注入问题。 IMO 其他任何事情都是业余的,近乎专业的渎职。

【讨论】:

  • Access 不理解未分隔的 ISO8601,将返回语法错误。它需要斜杠或破折号。在所有其他方面,这是一个很好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2019-11-11
  • 2013-12-04
  • 2022-01-20
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多