PB连接sqlserver

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PB连接sqlserver相关的知识,希望对你有一定的参考价值。

PB9连接SQLServer2000,在客户机上用pb9自带的数据库接口直接连接,就是连不上,出现如下错误:A SQLServer request resulted in a bad return code or status but no error massage was returned,但如果配子ODBC,然后再用pb9通过ODBC就可以连接,使用SQLServer的企业管理器也可以连接

参考技术A 在IP地址后面带上端口号试试,如192.168.10.1,1433

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],一切都没有问题,但是只要一执行就报错

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正常,则参数有问题,或者封装的这个对象处理参数的功能有问题;
确认下参数没有问题,没有异常字符的话,更新个封装对象的版本吧。

参考技术A 有两种可能:
第一、你写的字段和你数据库实际的数量不对。
第二、user是sql server中的关键字要使用[user]这样追问

第一,字段没有问题,把这条语句放在数据库中可以正常执行;
第二,我这里没有user啊???

参考技术B 只给错误不给代码不知道追问

数据库查询使用的是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 这个去掉呢?

以上是关于PB连接sqlserver的主要内容,如果未能解决你的问题,请参考以下文章

SqlServerSqlServer编程语言T-SQL的游标使用

SqlServerSqlServer编程语言T-SQL的简介及基本用法

PB连接sqlserver

PB连接ORALCE数据库方法

pb如何向数据库表中添加内容

PB中的数据窗口的数据源SQL语句在哪?