使用DButils,修改sqlserver2000数据库,代码如下:
public static void updatetest() {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "update guestbook set name=?,phone=? where id = ?";
String param[] = {"姓名","电话","2"};
try {
qr.update(conn, sql, param);
} catch (SQLException e) {
e.printStackTrace();
}
}
出现如下问题:
java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: 第 1 行: ',' 附近有语法错误。 Query: update guestbook set name=?,phone=? where id = ? Parameters: [姓名, 电话, 2]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:363)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:490)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:403)
at com.mydbutils.updatetest(mydbutils.java:91)
at com.mydbutils.main(mydbutils.java:31)
为了排除问题,做了如下尝试:
(1)是不是dbutils 对sqlserver update语句支持的问题
不使用占位符,直接写update guestbook set name='姓名',phone=‘电话' where id=2
执行,也能正常的修改,不是update语句的问题;
(2)是不是占位符的问题
使用占位符,直接写update guestbook set name=? where id=?
执行,也能正常的修改,看来占位符后面不出现“,”就没有问题;
应该是sqlserver的占位符和dbutils的兼容问题,这种情况下,程序没有处理,或者处理的不好,别的数据库没有尝试,更高版本的数据库也没有尝试,不敢轻易下结论。
(3)问题的解决
百度,有大神给出了解释:
sql的jdbc驱动在判断占位符类型的时候有问题;具体的就是获得ParameterMetaData的时候出了问题;
在dbutils中,如果更新没有指定参数类型,则会用上面的方法获得参数类型,同样报错;
可以用一个knowParaType的参数避免这个问题,
就是在创建QueryRunner的时候,提供一个true参数。
public static void updatetest() {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner(true);
String sql = "update guestbook set name=?,phone=? where id = ?";
String param[] = {"姓名","电话","2"};
try {
qr.update(conn, sql, param);
} catch (SQLException e) {
e.printStackTrace();
}
}