java连接sqlserver,提示语法错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java连接sqlserver,提示语法错误相关的知识,希望对你有一定的参考价值。
报错信息:java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'WHERE' 附近有语法错误。 Query: select * from (select src.*, row_number() over (order by src.id asc) rownum from (select id, parentid, name, enable from configcity where 1 = 1 ) src) row_ where row_.rownum < ? Parameters: [15]
这条语句在数据库中直接执行没有任何问题(把?换成15),但是在程序里执行的时候就报这个错,原来一直使用mysql,这次因为项目原因,要求使用sqlserver,原来没怎么接触过sqlserver,不知道这是什么原因,请各位大侠帮帮忙,急~~~!
最后的查询语句:this.list = run.query(querySql, new BeanListHandler<T>(clazz, DbOperator.BEAN_ROW_PROCESSOR), params);,this.list是个对象列表,断点调试的时候在执行查询之前查看querySql的值:select * from (select src.*, row_number() over (order by src.id asc) rownum from (select id, parentid, name, enable from configcity where 1 = 1 ) src) row_ where row_.rownum < ?,params的值:[15],一切都没有问题,但是只要一执行就报错
select * from (select src.*, row_number() over (order by src.id asc) rownum from (select id, parentid, name, enable from configcity where 1 = 1 ) src) row_ where row_.rownum < 15
这个语句是没错的。
你的调试下程序,看传递到后台语句是不是对的。
where row_.rownum < 15,这个是有个参数传递的,传递的结果可能不对。
具体要看你程序怎么写。
一般是where子句根据条件判断生成后,再与主SQL语句合并。这个过程中,有逻辑漏洞的话,where子句会生是一个“ where ” 之类
这样程序运行的SQL,实际上就会是如下:
select * from (select src.*, row_number() over (order by src.id asc) rownum from (select id, parentid, name, enable from configcity where 1 = 1 ) src) row_ where
这样就会出错。
这个问题,估计不是SQL语句的错,是程序生成SQL或传递SQL时的错。不要查语句问题了,查程序的SQL语句生成或传递的部分吧。
你还是把程序最后生成的SQL,输出后检查下吧。形如? Parameters: [15]之类的,最后生成的SQL绝不会有这些的。追问
我在程序中是一步一步进行断点调试的,到最后一步查询的时候sql语句就是上面那条语句,参数是个数组Parameters: [15],之前所有的都没问题,就最后执行的时候报错,报错信息就是之前发的那个
另外,之前用mysql就没问题,当然用mysql查询语句就不是这样了,最后只有“limit ?”
你所说的这些还不是最后一步呢。
你这只是把sql语句、参数传递完成。最后执行的sql语句是什么,你还没看到呢。
run.query()的返回就是已经执行完的结果么?那这样的话,中间还封装了有生成sql语句的过程。
你是用org.apache.commons.dbutils吧?我没用过,你看下封装的对象有没有提供输出sql语句的方法:
1、有的话,输出sql,然后检查下输出的语句,也即是最后在数据库端执行的那个sql,肯定是有问题的;
这时候,可以看下sql出问题的地方,是程序哪个地方生成的,那个地方的代码应该是有问题的;
2、没有办法获得输出的sql语句的话,只有笨办法:试:
先替换参数,不用参数的话,看下正常不。
2.1异常,则语句确实有问题,或者这个封装对象有问题;
语句问题的话,可能是有异常字符,比如全角空格、字符之类,逐段替换测试吧;
封装对象问题的话,更新个对象版本吧。
2.2正常,则参数有问题,或者封装的这个对象处理参数的功能有问题;
确认下参数没有问题,没有异常字符的话,更新个封装对象的版本吧。
第一、你写的字段和你数据库实际的数量不对。
第二、user是sql server中的关键字要使用[user]这样追问
第一,字段没有问题,把这条语句放在数据库中可以正常执行;
第二,我这里没有user啊???
数据库查询使用的是org.apache.commons.dbutils.QueryRunner.query,程序中最后执行的语句是:this.list = run.query(querySql, new BeanListHandler(clazz, DbOperator.BEAN_ROW_PROCESSOR), params);
参考技术C 参数怎么设的?cstmt.setInt(1, 15); 这样吗?追问
用的c3p0连接池和org.apache.commons.dbutils,最后执行的语句:this.list = run.query(querySql, new BeanListHandler(clazz, DbOperator.BEAN_ROW_PROCESSOR), params);
追答因为看不到具体写的过程,这个还真的很难说。
where 1 = 1 这个去掉呢?
Navicat P remium的SQL老提示语法错误!
想通过一个表来更新另一个表,语句在access里面是可以运行的!但是到了navicat里面就报语法错误!求大神指点!
这种多表关联更新的语法在sqlserver中是不支持的:
可以这样写:
update test1 set [name]=t2.[name]from test1 t1
inner join test2 t2 on t1.id=t2.id 参考技术A 检查下你的sqlserver的配置,这个错误应该是你的sqlserver禁用了远程访问导致的追问
我的远程访问是启用的!没有禁止哦!
以上是关于java连接sqlserver,提示语法错误的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver