Microsoft JDBC Driver 使用 getParameterMetaData 报错

不知道为何使用 Microsoft JDBC Driver for SQL Server 驱动时,sql语句不带参数没有问题,但是如果带参数且使用 getParameterMetaData 就会提示某个关键字附件有错误!下载了最新的 Microsoft JDBC Driver 4.1 for SQL Server 还是一样的错误。难道是没有设置好?做了下测试:

1、简单的语句测试,getParameterMetaData 对 between 支持有问题

 
----------------------- dbTest 执行语句方法 ------------------
     private void dbTest(String sql) {
         Connection conn = null ;
         PreparedStatement pstmt = null ;
         ResultSet rs = null ;
         ParameterMetaData pmd = null ;
         try {
             conn = DBHelper.getConnection();
             pstmt = conn.prepareStatement(sql);
             pmd = pstmt.getParameterMetaData(); // 关键是这个方法出问题
             pstmt.setObject( 1 , 100 );
             pstmt.setObject( 2 , 1000 );
             rs = pstmt.executeQuery();
             if (rs.next()) {
                 System.out.println(rs.getString( 1 ));
             }
         } catch (SQLException e) {
             e.printStackTrace();
         } finally {
             DBHelper.release(conn, pstmt, rs);
         }
     }
 
//--------------------------测试1---------------------------------
// 执行下面between语句,如果dbTest中启用pstmt.getParameterMetaData(),那么会报错,(com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'between' 附近有语法错误);但是如果注释掉 pmd = pstmt.getParameterMetaData(),那么执行正常。
 
String sql1 = "select * from users where userId between ? and ?" ;
dbTest(sql1);
 
//--------------------------测试2---------------------------------
// 将between替换成等效的(>= and <=),无论何种情况执行都正常
 
String sql2 = "select * from users where userId >= ? and userId <= ?" ;
dbTest(sql2);

2、子查询测试

1
2
3
4
5
6
// 不用 between,用 >= and <= 等效替换
// 启用 pmd = pstmt.getParameterMetaData(),报错(com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'WHERE' 附近有语法错误);但是如果不用pstmt.getParameterMetaData()这个方法,就正常执行了!
 
String sql3 = "select * from (select userId, userName from users) as tp where tp.userId >= ? and tp.userId <= ?" ;
dbTest(sql3);

3、换成jtds驱动没有任何问题。

     归纳下问题:

      (1)不用 getParameterMetaData 方法,任何sql语句执行都没有任何问题,关键是我要用dbutils,但是这个库使用了getParameterMetaData 方法。怎么解决。

      (2)使用getParameterMetaData方法时,不带参数的sql语句执行没有问题,但是如果带参数而且使用了between或者有子查询,那么就出错。为什么?是不是哪儿的设置问题?

 

==================================================================================

写了这些疑问查找了几天,后来仔细查看了Microsoft JDBC Driver for SQL Server的文档,才发现上面已经有了相关的说明。

在“使用参数元数据”一节中有如下提示:

SQLServerParameterMetaData 类和预定义的语句一起使用时有一些限制。JDBC 驱动程序支持 SELECT、DELETE、INSERT 和 UPDATE 语句。但是,这些语句不能包含子查询。此外,JDBC 驱动程序还支持使用 IN、IS 和 LIKE 谓词。对于搜索条件,JDBC 驱动程序支持使用 IS、<、>、LIKE、>=、<=、NOT IN、<>、!>、!< 和 != 比较运算符。不支持 FREETEXT 运算符。

dbutils使用QueryRunner时,可以设置pmdKnownBroken为true,dbutils设置参数时将绕过 getParameterMetaData 方法:

1
2
QueryRunner run = new QueryRunner( true );
QueryRunner run = new QueryRunner(dataSource, true );
喜欢简洁,远离繁琐

遇到问题,转载,原地址:https://www.cnblogs.com/myit/p/4260047.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值