作者:幸运之星07812 | 来源:互联网 | 2023-05-18 02:20
存储过程源码如下:CREATEPROCEDUREdbo.selectInfo@creator_idvarchar(50)ASdeclare@paravarchar(50)
存储过程源码如下:
CREATE PROCEDURE dbo.selectInfo @creator_id varchar(50)
AS
declare @para varchar(50)
set @para ='%'+@creator_id+'%'
--select * from job_plan
select * from job_plan where creator_id like @para
GO
JDBC调用部分源码:
String creator_id = "邱一来";
try{
Connection cOnn= ejbUtil.getConnection();
CallableStatement cs =null;
String selectSql = "{call selectInfo(?)}";
System.out.println("Creator_Id : "+creator_id);
cs = conn.prepareCall(selectSql);
cs.setString(1,creator_id);
//cs.execute();
//ResultSet rs = cs.getResultSet();
ResultSet rs= cs.executeQuery();
System.out.print(" "+rs.next());
while(rs.next()){
System.out.print(rs.getBigDecimal(1));
System.out.print("\t");
System.out.print(rs.getString(2).trim()+"\t");
System.out.print(rs.getString(6).trim()+"\t");
}
cs.close();
conn.close();
}
catch(SQLException ex){
System.err.println(ex.getMessage());
}
上述代码在ECLISPE 3.0下执行数据库连接正常,存储过程可以正常调用但总是查不到记录,控制台显示信息如下:
Creator_Id : 邱一来
false
表job_paln结构如下:
列名 数据类型 长度 是否允许为空
1 cid decimal 9 0
0 plan_title varchar 50 1
0 plan_conten text 16 1
0 finished_conten text 16 1
0 project_name varchar 50 1
0 creator_id varchar 50 1
0 complete_degree varchar 50 1
表中至少47条符合条件的记录,其中一条记录如下:(各子段值用";"分割)
42,招聘; 招聘; 上午到人才市场进行招聘,下午到公司面试;某某公安,邱一来;Bachelor
56 个解决方案
楼主修正一下:
表中至少47条符合条件的记录,其中一条记录如下:(各子段值用";"分割)
42;招聘; 招聘; 上午到人才市场进行招聘,下午到公司面试;某某公安;邱一来;Bachelor
CREATE PROCEDURE dbo.selectInfo @creator_id varchar(50)
AS
declare @para varchar(50)
set @para ='%'+@creator_id+'%'
--select * from job_plan
select * from job_plan where creator_id like @para
GO
在SQL SERVER 2000查询分析器下 执行 : EXEC selectInfo 邱一来
可查出47条记录,但通过JDBC在程序里调用相同的存储过程就是查不出来,这是什么原因?
楼主的操作系统是VISTA HOME PREMIUM,浏览器 IE7.0,装了TOMCAT 5.0,端口设为8888,本地部署了jobsWeb这个应用。在IE 7.0中请求http://localhost:8888/jobsWeb/jobs/, Jsp页面上所有的汉字乱码都是???.在页面上我已经加入了page cOntentType="text/html; charset=GBK". JSP页面上从SQLSERVER2000(sp4)中读出的数据每次必须要手工选择编码为"简体中文"才能正常显示
刚测试过,楼主的存储过程传英文进去是可以正常运行并返回结果的,问题就出在传中文值的时候!
是不是Sql server 2000的字符集设置问题,各位高人有遇到过类似问题的吗?
换个说法吧,在存储过程里怎么能取得JAVA程序传过来的中文值,并控制台上打印出JDBC传过来的中文参数值呢?在下面这个存储过程中该如何实现?
CREATE PROCEDURE dbo.selectInfo @creator_id varchar(50)
AS
declare @para varchar(50)
set @para ='%'+@creator_id+'%'
--select * from job_plan
select * from job_plan where creator_id like @para
GO
在SQL SERVER 2000查询分析器下 执行 : EXEC selectInfo 邱一来
可查出47条记录
我在Eclipse 3。0调试,在JDBC中用英文为参数去调存储过程查询可以查出结果,一换成中文就查不出来,可数据库中明明有符合条件的记录!而且在数据库服务端直接调试存储过程传中文参数可以查出结果,真是奇怪了!郁闷啊。。。。。。。。。。。。。
不要用存储过程,直接在Java代码中执行sql语句试试看~
如果还有错的话,把错误信息帖出来看一下
在Java代码中执行sql语句早就实现了,关键是以后表的记录数量要很大所以采用存储过程!
我的意思是让你试试,因为你这个问题的可能性有很多,如果你直接用sql没问题的话,那可能就是转码的问题了,如果连直接执行sql都有问题的话,那可能就是字符集的问题了,你可以换个服务器再试试~~~
如果是JAVA程序里的转码问题,具体该如何下列语句呢?
Connection cOnn= ejbUtil.getConnection();
CallableStatement cs =null;
String creator_id ="邱一来";
String selectSql = "{call selectInfo(?)}";
System.out.println("Creator_Id : "+creator_id);
cs = conn.prepareCall(selectSql);
cs.setString(1,creator_id); //重点修改这行代码,要加上转码语句
//cs.execute();
//ResultSet rs = cs.getResultSet();
ResultSet rs= cs.executeQuery();
System.out.print(" "+rs.next());
while(rs.next()){
System.out.print(rs.getBigDecimal(1));
System.out.print("\t");
System.out.print(rs.getString(2).trim()+"\t");
System.out.print(rs.getString(6).trim()+"\t");
}
cs.close();
conn.close();
}
catch(SQLException ex){
System.err.println(ex.getMessage());
}
对数据库的查询采用了存储过程,将查询内容作为参数
通过JDBC只能查询英文名称,不能查询中文名称,我的表字段是英文,字段值有的是中文
在数据库服务端(SQL2000 个人版)的查询分析器里却可以查询中文名称
在JDBC里调用存储过程返回表全部记录的话,却可以返回全部,这个是为什么??
如何解决呢????
在Eclipse3.0中,写JDBC程序用英文为参数去调存储过程查询可以查出结果,一换成中文值参数就查不出来,可数据库中明明有符合条件的记录!而且在数据库服务端用查询分析器直接调试存储过程传中文参数(调用语句:exec selectInfo 邱一来)可以查出47条符合条件结果,真是奇怪了!Eclipse3.0中,JAVA类的编码是UTF-8
郁闷啊。。。。。。。。。。。。。这到底是怎么回事?
sql server 2000 编码与java中的编码是不一样的,先将creator_id = "邱一来";转换为unicode编码或者gb2312,然后再传到存储过程中试试!
to snowfox_1028(胡须飘飘) :谢谢,我试下
String creator ="邱一来";
try{
Connection cOnn= ejbUtil.getConnection();
CallableStatement cs =null;
String selectSql = "{call selectInfo(?)}";
System.out.println("Creator_Id : "+creator);
cs = conn.prepareCall(selectSql);
String creator_id = new String(creator.getBytes("ISO-8859-1"),"GBK");
//String creator_id = new String(creator.getBytes("GBK"),"utf-8");
//String creator_id = new String(creator.getBytes("gbk2312"),"utf-8");
//String creator_id = URLEncoder.encode(creator,"GBK2312");
//String creator_id = URLEncoder.encode(creator,"utf-8");
cs.setString(1,creator_id);
试上了上述5种方法都不行,还是一输入中文就查不出记录!
//String creator_id = new String(creator.getBytes("GB2312"),"UTf-8");
// String creator_id = new String(creator.getBytes("ISO-8859-1"),"UTf-8");
//String creator_id = new String(creator.getBytes("ISO-8859-1"),"GBK2312");
String creator_id = new String(creator.getBytes("ISO-8859-1"),"GBK");
又试了四种还是查不出来!!!!!!换了非中文参数一下子就查出结果集了,代码如下:
String creator = "LILONG";
try{
Connection cOnn= ejbUtil.getConnection();
//Statement stmt = conn.createStatement();
//rs = stmt.executeQuery("select * from job_plan");
//rs = stmt.executeQuery("select * from logTable");
CallableStatement cs =null;
String selectSql = "{call selectInfo(?)}";
System.out.println("Creator_Id : "+creator);
//cs = conn.prepareCall(selectSql);
cs = conn.prepareCall(selectSql);
//cs = conn.prepareCall("selectAll");
//String creator_id = new String(creator.getBytes("GB2312"),"UTf-8");
// String creator_id = new String(creator.getBytes("ISO-8859-1"),"UTf-8");
//String creator_id = new String(creator.getBytes("ISO-8859-1"),"GBK2312");
String creator_id = new String(creator.getBytes("ISO-8859-1"),"GBK");
//String creator_id = new String(creator.getBytes("gbk2312"),"utf-8");
//String creator_id = new String(creator.getBytes("ISO-8859-1"),"GBK");
//String creator_id = URLEncoder.encode(creator,"GBK2312");
//String creator_id = URLEncoder.encode(creator,"utf-8");
cs.setString(1,creator_id);
cs.execute();
ResultSet rs = cs.getResultSet();
//ResultSet rs= cs.executeQuery();
//System.out.print(" "+rs.next());
while(rs.next()){
System.out.print(rs.getBigDecimal(1));
System.out.print("\t");
//System.out.print(rs.getString(6));
System.out.print(StringTools.fromHTML(rs.getString(5))+"\t");
System.out.print(StringTools.fromHTML(rs.getString(6).trim()));
System.out.print("\t");
System.out.println("$$$$$$");
}
cs.close();
conn.close();
}
catch(SQLException ex){
System.err.println(ex.getMessage());
}
catch(Exception ex){
}
这到底是怎么回事?难道是vista的原因?
换了另外一台座机的SQL SERVER 2000服务器,结果连都没连上
Tomcat == 服务器
SQL Server == 数据库
把Tomcat换了~~~
或者把你的整个项目原封不动的放到别一台电脑(vista和非vista系统都试下)上跑下看~~~
你的意思我明白了,可是TOMCAT部署了其他的Struts开发的程序都不乱码呀,怪事!
把源程序原封不动移动到xp座机上,连接不上SQLSERVER2000 个人版数据库,提示"Erroe Establishment socket"我用的vista系统的sony SZ422型笔记本.
waiting for the expert..................................
...........................................................................