Java Android查询,带有;在;操作员不工作
我有以下代码:Java Android查询,带有;在;操作员不工作,java,android,sql,sql-server-2008-r2,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
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") ";
但不幸的是,上述尝试并未奏效
我正在使用SQLServer2008R2
请告诉我。这是因为
字符串[]。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();
StringBuilder sb=新建StringBuilder();
sb.append(“updatemessagesmaster set rstamp=1,其中mid in(“);
对于(int i=0;i0)sb.追加(“,”);
附加(mlst[i])。附加(“”);
}
某人加上(“)”;
字符串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);
StringBuilder sb=新建StringBuilder();
sb.append(“updatemessagesmaster set rstamp=1,其中mid in(“);
对于(int i=0;i0){
某人加上(“,?”);
}否则{
某人加上(“?”);
}
}
某人加上(“)”;
字符串sql=sb.toString();
游标c=db.rawQuery(sql,mlst);
这是因为字符串[]。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();
StringBuilder sb=新建StringBuilder();
sb.append(“updatemessagesmaster set rstamp=1,其中mid in(“);
对于(int i=0;i0)sb.追加(“,”);
附加(mlst[i])。附加(“”);
}
某人加上(“)”;
字符串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);
StringBuilder sb=新建StringBuilder();
sb.append(“updatemessagesmaster set rstamp=1,其中mid in(“);
对于(int i=0;i0){
某人加上(“,?”);
}否则{
某人加上(“?”);
}
}
某人加上(“)”;
字符串sql=sb.toString();
游标c=db.rawQuery(sql,mlst);
带有“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();
StringBuilder b=new StringBuilder(“更新测试集col=value,其中mid IN(”);
对于(int i=0;i
带有“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();
StringBuilder b=new StringBuilder(“更新测试集col=value,其中mid IN(”);
对于(int i=0;i
mlst
是一个字符串[]
对象,它是一个数组。如果您试图将它连接到字符串,那么最终将使用它的toString()
方法,这不是您想要的。必须通过在数组中循环,从中生成一个字符串对象:
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中有一个参数绑定解决方案,您应该参考文档。mlst
是一个String[]
对象,它是一个数组。如果您试图将它连接到字符串,那么最终将使用它的toString()
方法,这不是您想要的。必须通过在数组中循环,从中生成一个字符串对象:
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中有一个参数绑定解决方案,您应该参考文档。这就是您要寻找的:
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());
String[]mlst={“sagar”、“dhanorkar”、“Ganesh”};
StringBuilder sb=new StringBuilder(“更新消息主设置rstamp=1,其中中间为(”);
int size=mlst.length;
对于(int i=0;i
这就是您要寻找的:
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());
String[]mlst={“sagar”、“dhanorkar”、“Ganesh”};
StringBuilder sb=new StringBuilder(“更新消息主设置rstamp=1,其中中间为(”);
int size=mlst.length;
对于(int i=0;i