使用“in”运算符的Android查询无效

时间:2013-09-12 09:02:02

标签: java android sql sql-server-2008-r2

我有以下代码:

public void UpdateMessage(String[] mlst) {
            // TODO Auto-generated method stub
            try
            {
                String sql="update messagesmaster set rstamp = 1 where mid in (" + mlst + ") ";
                statement = conn.createStatement();
                statement.executeUpdate(sql);

            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }

在这个mlst中是包含7个元素的字符串数组。

我想形成我的查询:

String sql="update messagesmaster set rstamp = 1 where mid in ("sagar","dhanorkar","Ganesh") ";

但不幸的是,上述尝试不起作用。

我正在使用sqlserver 2008 r2

请告诉我。

4 个答案:

答案 0 :(得分:1)

这是因为String[].toString()与将所有元素连接到有效的SQL字符串不同。

试试这个:

StringBuilder sb = new StringBuilder();
sb.append("update messagesmaster set rstamp = 1 where mid in (");
for (int i = 0;i < mlst.length; i++) {
    if (i>0) sb.append(", ");
    sb.append("'").append(mlst[i]).append("'");
}
sb.append(")");
String sql = sb.toString();

对于更合理的SQL使用(在性能和安全性方面),请使用:

StringBuilder sb = new StringBuilder();
sb.append("update messagesmaster set rstamp = 1 where mid in (");
for (int i = 0;i < mlst.length; i++) {
    if (i>0) {
        sb.append(", ?");
    } else {
        sb.append("?");
    }
}
sb.append(")");
String sql = sb.toString();
Cursor c = db.rawQuery(sql, mlst);

答案 1 :(得分:1)

  

使用“in”运算符无法正常工作的Android查询

由于您不使用参数化语句而是使用硬编码解决方案,因此需要将值包装为单引号:

where mid in ('" + mlst + "')

我不喜欢你的做法。它也不会起作用,因为你的mlst是数组。这不是人类可读和危险的。通常建议(也是我推荐)使用更安全和人类可读的参数化语句。

占位符(?)必须在您的情况下动态生成。

示例:

StringBuilder b = new StringBuilder("Update Test set col = value where mid IN(");
for (int i = 0; i < mlst.length; i++) {
   b.append("?");
   if (i < mlst.length - 1) {
      b.append(",");
   }
}
b.append(")");

PreparedStatement ps = connection.prepareQuery(b.toString());
for (int i = 0; i < mlst.length; i++) {
   ps.setString(i + 1, mlst[i]);
}
int result = ps.executeUpdate();

答案 2 :(得分:1)

mlst是一个String[]对象,它是一个数组。如果你试图将它连接到一个字符串,你最终将使用它不是你想要的toString()方法。您必须通过循环遍历数组来生成String对象:

StringBuilder b = new StringBuilder();
for(String str : mlst) {
    b.append(str);
    b.append(", ")
}
// you have to remove the last , or do not add it in the first place

然而,这里存在一个设计缺陷:您将任意值连接到查询,这可能导致SQL注入。在你盲目地使用它作为参数之前,我眨眼你应该清理mlst。我记得在Android中有一个参数绑定解决方案,你应该查阅文档。

答案 3 :(得分:1)

这就是你要找的东西:

String[] mlst = { "sagar", "dhanorkar", "Ganesh" };

StringBuilder sb = new StringBuilder("update messagesmaster set rstamp = 1 where mid in (");

int size = mlst.length;

for (int i = 0; i < size; i++) {
    // adding the first quote
    sb.append("\"");
    // adding the word
    sb.append(mlst[i]);
    // adding the second quote
    sb.append("\"");

    // adding the comma
    if (i < (size - 1)) {
    sb.append(",");
    }
}

// closing
sb.append(");");

System.out.println(sb.toString());