2

我正在尝试从我的数据库中获取 2013 年 6 月 3 日的记录,该数据库是在 ms 访问中创建的。日期以dd/MM/yyyy的格式存储,下面是我的查询

AND (a.Date = #" + date + "#) ) order by e.E_ID asc

但令人惊奇的是,我在 2013 年 3 月 6 日的日期插入了一条记录,即今天的日期,虽然它是 2013 年 3 月 6 日,但我已经更正了我的区域设置,仍然是同样的问题。同样在我的查询中,我正在查询匹配日期,我正在使用 dd/MM/yyyy。这是微软的错误吗?请帮忙

4

1 回答 1

2

日期存储格式为 dd/MM/yyyy

我怀疑他们不是。我怀疑它们是以某种本地日期/时间格式存储的,这无疑比 10 个字符串更有效。(例如,我假设您使用的是适当的字段类型而不是 varchar。)区分数据的固有性质和“转换为文本时如何显示”很重要。

但令人惊奇的是

我不认为这很神奇。我认为这是不必要地使用字符串转换的自然结果。他们最后几乎总是咬你。您不是在尝试表示字符串 - 您是在尝试表示日期。因此,尽可能使用该类型。

你应该:

  • 出于多种原因使用参数化 SQL 进行查询 - 最重要的是避免 SQL 注入攻击,同时避免这种不必要的字符串转换
  • 将参数值指定为 a DateTime,从而避免字符串转换

您还没有指定您使用的提供程序类型 - 我的猜测是OleDbConnection等等。通常,如果您查看Parameters相关命令类的属性的文档,您会找到一个合适的示例。例如,OleDbCommand.Parameters显示对OleDbConnection. 文档中值得注意的一件事:

OLE DB .NET 提供程序不支持将参数传递给 SQL 语句或由OleDbCommandwhenCommandType设置为调用的存储过程的命名参数Text?在这种情况下,必须使用问号 ( ) 占位符。OleDbParameter[...] 因此,添加对象的顺序OleDbParameterCollection必须直接对应于命令文本中参数的问号占位符的位置。

于 2013-06-03T18:25:11.587 回答