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