SQL CommandText的语法不正确

本文关键字:不正确 语法 CommandText SQL | 更新日期: 2024-09-19 16:21:04

我正在尝试构建一个SQL查询,并将传递一个字符串作为参数。然而,我得到了一个不正确的语法错误。我已经打印出了价值观,但对我来说一切都很好。

我有一个字符串"sqlString",它是通过一系列串联构建的,生成以下内容:

sqlString = " and (event_id=60 OR event_id=61 OR event_id=56 OR event_id=73)"
SqlCommand totalCmd = new SqlCommand();
totalCmd.CommandText = "SELECT sum(datediff(hour,[event_start],[event_end])) as Timeworked FROM event WHERE (event_start >= @StartDate and event_end <= @EndDate) @mySqlString";
totalCmd.Parameters.AddWithValue("StartDate", txtStartDate.Text);
totalCmd.Parameters.AddWithValue("EndDate", txtEndDate.Text);
totalCmd.Parameters.AddWithValue("mySqlString", sqlString);
totalDT = SqlComm.SqlDataTable(totalCmd);

这产生了一个错误

"@mySqlString"附近的语法不正确

我通过输入参数直接在SQL中运行了这个查询,它运行得很好。传递mySqlString参数有什么问题?

SQL CommandText的语法不正确

不能将sqlString添加为参数。您应该将它直接连接到CommandText:

totalCmd.CommandText = "SELECT sum(datediff(hour,[event_start],[event_end])) as Timeworked FROM event WHERE (event_start >= @StartDate and event_end <= @EndDate) " + sqlString;

将值添加到Parameters而不是串联的全部目的(除了整洁之外)是清除恶意命令的值,即参数应仅为纯值。因此,按照您现在的做法,sqlString被解释为SQL注入攻击,并且基本上会被该检查清除。

您需要将@符号放在参数前面,如下所示:

totalCmd.Parameters.AddWithValue("@StartDate", txtStartDate.Text);
totalCmd.Parameters.AddWithValue("@EndDate", txtEndDate.Text);
totalCmd.Parameters.AddWithValue("@mySqlString", sqlString);

注意:您的语法没有找到匹配项,因此参数值没有被替换,因此它在查询中传递@mySqlString