1

我有以下代码:

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

4 回答 4

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);
于 2013-09-12T09:05:54.070 回答
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();
于 2013-09-12T09:06:21.780 回答
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中有参数绑定的解决方案,你应该查阅文档。

于 2013-09-12T09:09:11.230 回答
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());
于 2013-09-12T09:13:42.750 回答