不知道为何使用 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、子查询测试

// 不用 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 方法:

    QueryRunner run = new QueryRunner(true);
QueryRunner run = new QueryRunner(dataSource, true);

最新文章

  1. Activity系列讲解---返回结果的处理
  2. Android 本地/网路下载图片实现放大缩小
  3. AES加密补位填充的一个问题
  4. Android菜鸟成长记9 -- selector的用法
  5. JNI技术概念小结
  6. php返回json数据中文显示的问题
  7. 最好用的placeholder插件,jQuery插件EnPlaceholder
  8. html5 canvas 笔记五(合成与裁剪)
  9. 基于阿里云服务器的git服务器搭建
  10. Ibatis学习总结1--ibatis简介和SQL Maps
  11. Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)C. Bear and Poker
  12. [ImportNew]Java中的Timer类和TimerTask类
  13. javaWeb图片验证码代码
  14. HDOJ Sudoku Killer(dfs)
  15. HDU 4293 Groups
  16. 编译安装 python 2.7
  17. PHP——emjoin表情存入数据库
  18. python(6):Scipy之pandas
  19. 31. Next Permutation 返回下一个pumutation序列
  20. P3455 [POI2007]ZAP-Queries(莫比乌斯反演)

热门文章

  1. 使用MDI窗体实现多窗口效果
  2. openfire存储中文字符乱码解决办法
  3. 使用Visual Studio进行单元测试-Part3
  4. BZOJ4009:[HNOI2015]接水果
  5. log4net 使用
  6. 低调的css3属性font-size-adjust
  7. Ajax前端调后台方法
  8. JAVA基础知识总结1(概述)
  9. Code Page Identifiers - Copy from Microsoft
  10. Struts学习第一课 使用Filter作为控制器的MVC应用