java连接sqlserver,提示语法错误 50

报错信息:java.sql.SQLException:com.microsoft.sqlserver.jdbc.SQLServerException:关键字'WHERE'... 报错信息: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],一切都没有问题,但是只要一执行就报错
展开
 我来答
klee2000163
2014-08-22 · TA获得超过102个赞
知道答主
回答量:30
采纳率:100%
帮助的人:37.3万
展开全部
SQL Server端运行的语句是如下吧:
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正常,则参数有问题,或者封装的这个对象处理参数的功能有问题;
确认下参数没有问题,没有异常字符的话,更新个封装对象的版本吧。
骚年EN5
2014-08-22 · TA获得超过100个赞
知道答主
回答量:118
采纳率:0%
帮助的人:62.5万
展开全部
有两种可能:
第一、你写的字段和你数据库实际的数量不对。
第二、user是sql server中的关键字要使用[user]这样
追问
第一,字段没有问题,把这条语句放在数据库中可以正常执行;
第二,我这里没有user啊???
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
云中凌2
2014-08-22 · TA获得超过718个赞
知道小有建树答主
回答量:808
采纳率:50%
帮助的人:240万
展开全部
只给错误不给代码不知道
追问
数据库查询使用的是org.apache.commons.dbutils.QueryRunner.query,程序中最后执行的语句是:this.list = run.query(querySql, new BeanListHandler(clazz, DbOperator.BEAN_ROW_PROCESSOR), params);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tmartin1981
2014-08-22 · TA获得超过209个赞
知道小有建树答主
回答量:516
采纳率:0%
帮助的人:335万
展开全部
参数怎么设的?
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 这个去掉呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式