我有以下代码:
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
请告诉我。
答案 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());