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、子查询测试
// 不用 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);
Microsoft JDBC Driver 使用 getParameterMetaData 会报错?的更多相关文章
- JDBC driver连接MySQL运行报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than
出错原因: 因为安装mysql的时候时区设置的不正确. mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用GMT+8:00格式. 也就是说是数据库和系统时区差异所造成的. 验证:运行c ...
- 下载 Microsoft JDBC driver 7.2 for SQL Server
下载 Microsoft JDBC driver 7.2 for SQL Server:https://www.microsoft.com/zh-cn/download/confirmation.as ...
- 数据库 alert.log 日志中出现 "[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER'"报错信息
现象描述: (1).数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理. (2).数据库 alert 日志 Thu Sep 06 06:53:00 2018 Errors ...
- 在IDEA中使用JDBC获取数据库连接时的报错及解决办法
在IDEA中使用JDBC获取数据库连接时,有时会报错Sat Dec 19 19:32:18 CST 2020 WARN: Establishing SSL connection without ser ...
- 喜大普奔,微软Microsoft JDBC Driver For SQL Server已发布到maven中央仓库
相信通过java和SQLServer开发应用的同学们都经历过如下类似的问题. 微软提供的JDBC官方驱动没有放置在Maven仓库中,这样如果你的Java应用需要访问SQL Server,你不得不下载s ...
- JDBC连接SQL Server 2005 报错Connection refused: connect
com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败.错误:“Connect ...
- Microsoft Visual Stduio 2005 Ent安装报错解决方法
错误:Microsoft Visual Studio 2015 Devenv : 安装时发生严重错误 安装过程第一次出现该错误时,查看了日志文件,错误提示如下: [0EEC:0EF0][2016-10 ...
- Microsoft SQL server Management Studio工具报错“应用程序的组件中发生了无法处理的异常”
解决办法 打开目录: C:\Documents and Settings\Administrator\Application Data\Microsoft\Microsoft SQL Server\1 ...
- Microsoft.Practices.Unity使用配置文件总是报错The type name or alias could not be resolved.
Type name could not be resolved. Please check config file http://stackoverflow.com/questions/1493564 ...
随机推荐
- VBScript 内置函数
本页列出了所有内建的 VBScript 函数: Date/Time 函数 Conversion 函数 Format 函数 Math 函数 Array 函数 String 函数 其他函数 Date/Ti ...
- Qt安装与配置
安装Qt 安装Qt Creator,打开终端执行如下命令: sudo apt-get install qt5-default qtcreator -y 安装Qt示例和文档: sudo apt-get ...
- 第二次C语言实验报告
#一.设计题目,设计思路,实现方法 ##设计题目 15-10 找最长的字符串,14-5 指定位置输出字符串,13-6 数组循环右移,12-5 查找指定字符,11-5 打印杨辉三角. ##设计思路 15 ...
- 谷歌浏览器的input自动填充出现黄色背景解决方案(在已经输入内容之后)
当你之前提交过表单,再次获取input焦点时,会有一个记录之前填写过的文本的下拉列表式的自动填充效果且带有黄色背景, 这个填充功能本身是没什么问题的,但是谷歌浏览器给了个莫名其妙的黄色背景,用css样 ...
- Ubuntu 安装配置Jenkins
一.安装jdk 1. sudo add-apt-repository ppa:webupd8team/java 添加ppa源 如果提示找不到该命令则需要安装: sudo apt-get install ...
- C笔试题(二)
/* 现在有一个数组 我们可以定义数组的子数组 如 数组 1 3 4 2 5 8 7 它的子数组可以是 1 3 4 3 4 2 5 等等 请写一个算法 找一个子数组 这个子数组递增不减少 并且是满足递 ...
- Java学习路线-知乎
鼬自来晓 378 人赞同 可以从几方面来看Java:JVM Java JVM:内存结构和相关参数含义 · Issue #24 · pzxwhc/MineKnowContainer · GitHub J ...
- CentOS 7 配置 mariadb
一.安装mariadb : yum groupinstall mariadb mariadb-client -y 二.启动(设置开机启动)服务 : systemctl start (enabl ...
- win7 系统安装 docker
如果顺利的话,步骤如下: 1.下载DockerToolbox 2.安装DockerToolbox,默认配置,一路下一步即可完成安装 3.安装成功后,桌面会新增三个快捷方式,如下图 4.点击运行Dock ...
- 【并发编程】Future模式添加Callback及Promise 模式
Future Future是Java5增加的类,它用来描述一个异步计算的结果.你可以使用 isDone 方法检查计算是否完成,或者使用 get 方法阻塞住调用线程,直到计算完成返回结果.你也可以使用 ...