我在ASP / C#中设计了一个基本搜索,用于搜索数据库中的记录,并为用户提供了可用于搜索的字段:word / phrase,dateFrom,dateTill。因此,分别输入“Hello,World!”,05/25 / 2009,06 / 25/2009将搜索内容为“Hello,World!”的数据库记录。这是在给定日期之间创建的。非常简单的东西。
用户输入字段的文本将直接注入SQL语句,如下所示:
SELECT r.idRecord, r.recordText
FROM record r
WHERE LOWER(CAST(r.recordText AS VARCHAR)) LIKE LOWER('%" + word/phrase + "%')
AND r.creationDate BETWEEN '" + dateFrom + "' AND '" + dateTill + "'"
所以仍然非常简单,当用户以美国格式输入日期时,它就像一个魅力,mm / dd / yyyy。但是,当输入英国格式的日期时,它会失败,如25/05/2009。最后...
SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS [DD/MM/YYYY]
...没有特别的帮助,因为我不想选择日期,是否可以在WHERE子句中使用类似的语句?
感谢您的帮助。
答案 0 :(得分:4)
Heinzi的评论根本不是一个侧面说明:你绝对应该在这里使用参数化SQL。那样:
您根本不应该在SQL中包含动态值 - 始终使用参数。有关示例,请参阅the documentation for SqlCommand.Parameters
。
答案 1 :(得分:3)
使用DateTime.ParseExact method将用户输入的值解析为DateTime
数据类型。此方法允许您指定日期时间的格式,因此您可以使用dd/MM/yyyy
或MM/dd/yyyy
,具体取决于您的用户偏好。然后将DateTime值作为参数传递给SQL语句。
这是一篇解释
的博客文章