查询表达式中缺少运算符的语法错误

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”是字符串吗?如果没有,请尝试删除这些值的引号。

【讨论】:

以上是关于查询表达式中缺少运算符的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

查询表达式中的语法错误(缺少运算符)“

在 MS Access 中的查询表达式中出现语法错误(缺少运算符)

查询表达式中的语法错误(缺少运算符)

查询表达式中的语法错误(缺少运算符) - ASP.NET

语句中的查询表达式中的语法错误(缺少运算符)

Access 2010:查询表达式中的语法错误(缺少运算符)