更新语句语法错误

Posted

技术标签:

【中文标题】更新语句语法错误【英文标题】:Update statement syntax error 【发布时间】:2012-10-11 07:56:22 【问题描述】:

我有以下字符串,其中包含我要执行的查询:

     query = "UPDATE inventario"
     + " set descripcion = '" + descripcion + "',"
     + " set bodega = '" + bodega + "'"
     + " where codigo = " + codigo;

我收到一个,但我没有看到错误在哪里。任何帮助表示赞赏。 “description”和“bodega”列是文本类型列。

【问题讨论】:

你能回显解释过的查询吗?基本上是System.out.println(query);,在你分配了所有变量之后;请 - 考虑使用准备好的语句。 这个查询让我好痒。 【参考方案1】:

删除查询中多余的SET

query = "UPDATE inventario"
 + " set descripcion = '" + descripcion + "',"
 + "     bodega = '" + bodega + "'"
 + " where codigo = " + codigo;

但该查询容易受到SQL Injection 的攻击。请参数化您的查询。 例如,

String query = "UPDATE inventario" + 
               "   set descripcion = ?, bodega = ? " + 
               " where codigo = ?";
PreparedStatement prep = connection.prepareStatement(query);
prep.setString(1, descripcion);
prep.setString(2, bodega);
prep.setInt(3, codigo);
prep.executeUpdate();

【讨论】:

哦,废话没有抓住额外的一套。感谢您的指点。是的,您对 sql 注入是正确的,我将使用线程中另一个人指出的准备好的语句。非常感谢大家。【参考方案2】:

这可能是因为您有多个 set 部分而不是使用逗号分隔,并且可能是因为您在 codigo 值周围没有引号(如果那是另一个字符串)......但我会强烈建议您无论如何都不要创建这样的 SQL,直接在 SQL 中使用值。

改为使用准备好的语句:

String sql = "UPDATE inventario set descripcion=?, bodega=? where codigo=?";
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, descripcion);
st.setString(2, bodega);
st.setString(3, codigo);

使用准备好的语句具有三个直接的好处:

它避免了SQL injection attacks(想想如果你的描述中有引号会发生什么) 它将代码 (SQL) 与数据(值)分开 这意味着您可以避免转换日期时间等类型,在这种情况下,通过字符串表示是一个巨大的潜在错误来源

【讨论】:

【参考方案3】:

SET 关键字只需要一次。正在更新的多个列应以逗号分隔,如下面的语句所示。

query = "UPDATE inventario"
    + " set descripcion = '" + descripcion + "',"
    + "     bodega = '" + bodega + "'"
    + " where codigo = " + codigo;

顺便说一句,强烈建议使用PreparedStatement 进行此类操作,而不是像这样形成查询以避免SQL Injection 攻击。

query = "UPDATE inventario"
    + " set descripcion = ?, bodega = ? "
    + " where codigo = ?";
PreparedStatement ps = connection.prepareStatement(query);
ps.setString(1, descripcion);
ps.setString(2, bodega);
ps.setInt(3, codigo);
int updateCount = ps.executeUpdate();

【讨论】:

以上是关于更新语句语法错误的主要内容,如果未能解决你的问题,请参考以下文章

更新时更新语句中的语法错误

更新语句上的 MySQL 语法错误

更新语句中的 VB.NET 语法错误

访问中的 SQL 更新语句的语法错误

更新时出现休眠错误:无法执行语句,在 'index=1' 附近使用正确的语法

在 Access 数据库中更新密码时 UPDATE 语句中的语法错误