Struts1.2中用dbcp实现数据源后调用返回游标类型的存储过程出错 请教大家
都郁闷好几天了
没有找到相关的帖子
例子很简单,只是从数据库中读出新闻类型字段
java代码如下:<logic:iterate id="menu" name="menu" type="com.website.struts.entity.NewType">
     <tr><td height="20px" width="276" ></td></tr>
     <tr>
     <td align="center" >
     <table border="0" cellpadding="0" cellspacing="0" >    
     <tr>
     <td align="center" valign="middle" style="font-size:20px;font-family:宋体-方正超大字符集;color:#ffffff">
     <a href="<%=request.getContextPath()%>/newinfo.do?type=<bean:write property="typeid" name="menu"/>">
     <bean:write property="typename" name="menu"/></a>
     </td>
     </tr>    
     </table>    
     </td>
     </tr>
     <tr height="1px">
     <td width="268px" background="nnews/linen.png"></td>
     </tr>    
     </logic:iterate>struts-config.xml配置如下:<data-source key="oracle" type="org.apache.commons.dbcp.BasicDataSource">
     <set-property property="password" value="PIRATESTUDIO" />
      <set-property property="minCount" value="2" />
      <set-property property="maxCount" value="50" />
      <set-property property="username" value="PIRATESTUDIO" />
      <set-property property="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
      <set-property property="description" value="oracle" />
      <set-property property="url" value="jdbc:oracle:thin:@192.168.1.104:1521:GAME" />
      <set-property property="readOnly" value="false"/>
      <set-property property="autoCommit" value="true" />
      <set-property property="loginTimeOut" value="100"/>
      <set-property property="minActive" value="2"/>
      <set-property property="maxActive" value="20"/>   
    </data-source> action代码:NewContentsDAO con = new NewContentsDAO(getDataSource(request,"oracle"));
list = (ArrayList<?>)con.getNewsType();
request.setAttribute("menu", list);
return mapping.findForward("list");dao代码package com.website.struts.DAO;import java.sql.CallableStatement;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
import javax.sql.DataSource;import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleResultSet;
import oracle.jdbc.driver.OracleTypes;import com.website.struts.entity.*;public class NewContentsDAO {
private DataSource ds;
private Connection conn = null;
private ResultSet rs = null;
private PreparedStatement ps;
private ArrayList<NewType> list = new ArrayList<NewType>();
public NewContentsDAO(){
}
public NewContentsDAO(DataSource dataSource){
ds = dataSource;
try {
conn = ds.getConnection();
} catch (SQLException e) {
System.out.println("conn init err");
e.printStackTrace();
if(conn != null){
try {
conn.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
public Collection<NewType> getNewsType(){
String sql = "select distinct N_type, N_type_t from piratestudio.news";
try {
if(conn.isClosed()){
throw new IllegalStateException("ERROR.TIME CONNECTION ISCLOSED");
}
OracleCallableStatement cs = (OracleCallableStatement) conn.prepareCall("{call piratestudio.ntype.news_type(?,?)}");//报错提示的地方
cs.setString(1, sql);
cs.registerOutParameter(2, OracleTypes.CURSOR);
cs.execute();
rs =cs.getCursor(2);
while(rs.next()){
System.out.println("rs.next");
System.out.println("rs.getString" + rs.getString(1));
System.out.println("rs.getInt" + rs.getInt(2));
System.out.println("rs end");
NewType newtype = new NewType();
newtype.setTypeid(rs.getInt(2));
System.out.println("N_type_t"+rs.getInt(2));
newtype.setTypename(rs.getString(1));
list.add(newtype);
}
} catch (SQLException e) {
        System.out.println("ps,rs err");
        e.printStackTrace();
}finally{
if(conn != null){
try {
conn.close();
System.out.println("Contents +CONN IS CLOSED");
} catch (SQLException e) {
System.out.println("conn close err");
e.printStackTrace();
}
}
}
return list;
}
}错误信息
java.lang.ClassCastException: org.apache.commons.dbcp.DelegatingCallableStatement
at com.website.struts.DAO.NewContentsDAO.getNewsType(NewContentsDAO.java:64)
at com.website.struts.action.NewinfoAction.execute(NewinfoAction.java:58)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
---------------------------------------------------------------------------------------------------------
尽管知道错误提示的地方,但小弟对这个错是在是搞不懂是什么原因,如何解决,请帮帮忙。连接Oracle用的jar包和commons-pool-1.3.jar、commons-dbcp-1.2.1.jar已经加到构建路径里了 并且试验了不用存储过程用普通的select语句就好用,oracle用的是10g,jar包是classes12.jar 不知道为什么 恳请各位指点!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【wxshushude】截止到2008-07-21 17:01:04的历史汇总数据(不包括此帖):
    发帖的总数量:21                       发帖的总分数:600                      每贴平均分数:28                       
    回帖的总数量:13                       得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:18                       结贴的总分数:480                      
    无满意结贴数:6                        无满意结贴分:170                      
    未结的帖子数:3                        未结的总分数:120                      
    结贴的百分比:85.71 %               结分的百分比:80.00 %                  
    无满意结贴率:33.33 %               无满意结分率:35.42 %                  
    楼主加油
      

  2.   

    异常说明,类在强转时出错,类型不匹配。
    你把代码写成这样:Object callableStatement = conn.prepareCall("{call piratestudio.ntype.news_type(?,?)}");//在这加断点,debug看prepareCall的返回值callableStatement的class name 是不是CallableStatement.
    /**要是不会用debug,可以用下面的代码 start**/
    if(callableStatement instanceof CallableStatement){
       Sysout....... (ok)
    }else{
      Sysout....... (error)
    }
    /**要是不会用debug,可以用下面的代码 end**/
    OracleCallableStatement cs = (OracleCallableStatement) callableStatement;
      

  3.   

    就改这两句试试,CallableStatement cs = conn.prepareCall("{call piratestudio.ntype.news_type(?,?)}");
    rs = ((OracleCallableStatement)cs).getCursor(2);
      

  4.   

    问题已解决,特将修改方法和原因贴出以共分享。
    将下列语句OracleCallableStatement cs =                                                  (OracleCallableStatement)onn.prepareCall("callpiratestudio.ntype.news_type(?,?)}");//报错提示的地方
    cs.setString(1, sql);
    cs.registerOutParameter(2, OracleTypes.CURSOR);
    cs.execute();
    rs =cs.getCursor(2);改为以下语句CallableStatement cs =                                                                              conn.prepareCall("callpiratestudio.ntype.news_type(?,?)}");
    cs.setString(1, sql);
    cs.registerOutParameter(2, OracleTypes.CURSOR);
    cs.execute();
    rs = (ResultSet) cs.getObject(2);即可。
    其原因是由于我使用了连接池,在使用了连接池的地方(web服务器的连接池,如:tomcat,weblogic和jboss等)
    )用此处的语句,如果是为采用连接池,则使用我上面帖子的方法。即可。