查询表达式中缺少运算符的语法错误
Posted
技术标签:
【中文标题】查询表达式中缺少运算符的语法错误【英文标题】:syntax error missing operator in query expression 【发布时间】:2015-05-29 16:08:00 【问题描述】:当我运行以下查询时,查询表达式出现语法错误。
private void button8_Click(object sender, EventArgs e)
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query1 = "UPDATE Points SET PNTS =
(case when EmpName = '" + comboBox1.Text +
"' then '" + label15.Text + "' when EmpName = '" +
comboBox2.Text + "' then '" + label16.Text +
"' when EmpName = '" + comboBox3.Text + "' then '" +
label17.Text + "' end) WHERE EmpName in ('" +
comboBox1.Text + "', '" + comboBox2.Text + "', '" +
comboBox3.Text + "')";
command.CommandText = query1;
command.ExecuteNonQuery();
connection.Close();
错误是:
查询表达式中的语法错误(缺少运算符)'(case when EmpName = 'Sam' 然后 '5.6' 当 EmpName = 'shane' 然后 '1.6' 当 EmpName = 'Mike' 然后 '0.8' end)'。
【问题讨论】:
您的代码对 SQL 注入产生了很大的错误。 这是要更新什么数据库?它绝对不像 SQL Server 中的 Case/When 的 SQL。 (我强烈建议构建参数化 SQL,而不是直接使用输入构建 SQL...) 您的代码非常容易受到SQL injection 攻击。为了您的用户,请使用parameterized queries。 【参考方案1】:您的 sql 中有语法错误(ms Access 没有大小写表达式)。改写源码行如下:
string query1 =
"UPDATE Points SET PNTS = "
+ "SWITCH ("
+ " EmpName = '" + comboBox1.Text + "', '" + label15.Text + "'"
+ ", EmpName = '" + comboBox2.Text + "', '" + label16.Text + "'"
+ ", EmpName = '" + comboBox3.Text + "', '" + label17.Text + "'"
+ ", true, ''"
+ ")"
+ " WHERE EmpName in ('" + comboBox1.Text + "', '" + comboBox2.Text + "', '" + comboBox3.Text + "')"
;
为了应对 sql 注入的风险,请考虑使用一些评论者建议的参数化 sql:
OleDbParameter parameter;
// The n-th generic placeholder in the sql string will be set to the n-th registered Parameter Value.
// '12' represents the data size, adjustment may be needed ( can possibly be dropped altogether )
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = comboBox1.Text;
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = label15.Text;
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = comboBox2.Text;
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = label16.Text;
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = comboBox3.Text;
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = label17.Text;
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = comboBox1.Text;
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = comboBox2.Text;
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12);
parameter.Value = comboBox3.Text;
string query1 =
"UPDATE Points SET PNTS = "
+ "SWITCH ("
+ " EmpName = ?, ?"
+ " EmpName = ?, ?"
+ " EmpName = ?, ?"
+ ", true, ''"
+ ")"
+ " WHERE EmpName in (?, ?, ?)"
;
警告
未经测试的代码,源自文档。
【讨论】:
如何将 label15.Text、label16.Text 和 label17.Text 值添加到当前数据库值和总数中?【参考方案2】:(当 EmpName = 'Sam' 然后 '5.6' 时的情况.....)
您不必为数值使用引号。数据库中的“PNTS”是字符串吗?如果没有,请尝试删除这些值的引号。
【讨论】:
以上是关于查询表达式中缺少运算符的语法错误的主要内容,如果未能解决你的问题,请参考以下文章