SQL CommandText上的语法不正确

时间:2013-12-13 20:25:07

标签: c# asp.net sql

我正在尝试构建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参数有什么问题?

2 个答案:

答案 0 :(得分:3)

您无法添加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 injection攻击,并且基本上会被该检查清除。

答案 1 :(得分:2)

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

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

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