2

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

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

我收到一个更新语句语法错误,但我看不到错误在哪里。任何帮助表示赞赏。“描述”和“酒窖”列是文本类型列。

4

3 回答 3

8

嗯,这可能是因为你有多个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 注入攻击(想想如果你的描述中有引号会发生什么)
  • 它将代码(SQL)与数据(值)分开
  • 这意味着您避免转换日期时间等类型,在这种情况下,通过字符串表示是一个巨大的潜在错误来源
于 2012-10-21T06:52:32.630 回答
2

删除额外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();
于 2012-10-21T06:51:27.027 回答
1

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

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

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

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();
于 2012-10-21T06:51:23.090 回答