1

以下是我的 MS sql-server 语句,在我的 C# Windows 应用程序中使用。正如标题所示,它选择文本框日期之间的所有产品编号。我对 SQL 相当缺乏经验,所以我的尝试可能是一个暴行。SQL 似乎是这么认为的。

string strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "')";

SQL 错误消息:“关键字 'WHERE' 附近的语法不正确。”

4

4 回答 4

4
string strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "')";

那是因为 WHERE 子句应该在前面 ORDER BY

string strSQL = "SELECT * FROM HISTORY WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "' ORDER BY productNumber)"  ;
于 2012-10-04T21:02:27.593 回答
3
"    SELECT * FROM HISTORY 
    WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "')
    ORDER BY productNumber "

order by 在 where 子句之后

于 2012-10-04T21:02:27.233 回答
1

我注意到您使用@strt_dateand @end_date(它们是 T-SQL 变量)作为列名。此外,子句ORDER BY应该WHERE子句之后。


顺便说一句,您不应该以这种方式编写查询代码的原因有很多。谷歌“SQL 注入”是一个非常令人大开眼界的安全问题。

而是使用参数化查询。它们更安全,更不容易出现由值字段中的无效字符引起的语法错误。

http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06

于 2012-10-04T21:04:45.313 回答
1

如果只是日期,则 SQL 注入的可能性不大,尤其是在您验证它的情况下。

如果必须将日期作为字符串传递给 SQL Server,则它应该采用明确的 YYYYMMDD 格式。但我也会将输入的验证添加为日期。

在那个声明之前有这个

CultureInfo provider = CultureInfo.InvariantCulture;

然后,将其更改为

string strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" +
  DateTime.ParseExact(KHDate1Box.Text, "d", provider).ToString("yyyyMMdd")
  + "' and @end_date <= '" +
  DateTime.ParseExact(KHDate2Box.Text, "d", provider).ToString("yyyyMMdd") + "')";

捕获未能解析日期的错误。

参考:我使用了“d”,但这里是标准日期时间格式的列表

于 2012-10-04T21:22:53.720 回答