首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Update语句语法错误

问Update语句语法错误
EN

Stack Overflow用户
提问于 2012-10-21 14:49:07
回答 3查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
     query = "UPDATE inventario"
     + " set descripcion = '" + descripcion + "',"
     + " set bodega = '" + bodega + "'"
     + " where codigo = " + codigo;

我得到了一个更新语句语法错误,但我看不出哪里是错误。任何帮助都是非常感谢的。列"descripcion“和"bodega”是文本类型的列。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-21 14:52:33

嗯,这可能是因为您使用了多个set部分,而不是使用逗号分隔,也可能是因为您的codigo值没有引号(如果这是另一个字符串)……但我强烈建议您不要像这样创建SQL,直接在SQL中使用值。

取而代之的是使用预准备语句:

代码语言:javascript
复制
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)与数据(值)分开
  • 它意味着您避免对datetime这样的类型进行转换,在这种情况下,通过字符串表示是一个巨大的潜在错误来源
票数 8
EN

Stack Overflow用户

发布于 2012-10-21 14:51:27

删除查询中的额外SET。

代码语言:javascript
复制
query = "UPDATE inventario"
 + " set descripcion = '" + descripcion + "',"
 + "     bodega = '" + bodega + "'"
 + " where codigo = " + codigo;

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

代码语言:javascript
复制
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();
票数 2
EN

Stack Overflow用户

发布于 2012-10-21 14:51:23

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

代码语言:javascript
复制
query = "UPDATE inventario"
    + " set descripcion = '" + descripcion + "',"
    + "     bodega = '" + bodega + "'"
    + " where codigo = " + codigo;

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

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12995642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档