Dbutils Sqlserver Update 占位符问题

 使用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();
     }
 }  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值