枫叶梨花 2018-02-01 13:59 采纳率: 100%
浏览 2083
已采纳

java调用存储过程时的错误

public static int getNum(){
        Connection conn = null;
        CallableStatement cs =null;
        try {
            conn = JdbcUtils.getConnection();
            cs = conn.prepareCall("{call getNum(?)}");
            cs.registerOutParameter(1, Types.INTEGER);
            cs.execute();
            int num = cs.getInt(1);
            return num;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(cs!=null){
                    cs.close(); 
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            JdbcUtils.free(null, null, conn);
        }

        return 0;
    }

这样写总是返回0,如果改成下面那样就对了,这是为什么

    Connection conn = null;
        CallableStatement cs =null;
        try {
            conn = JdbcUtils.getConnection();
            cs = conn.prepareCall("{call getNum(?)}");
            cs.registerOutParameter(1, Types.INTEGER);
            ResultSet result=cs.executeQuery();
            int num = 0;
            if(result.next()){
                num = result.getInt("num");
            }
            return num;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(cs!=null){
                    cs.close(); 
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            JdbcUtils.free(null, null, conn);
        }

        return 0;
    }

  • 写回答

6条回答 默认 最新

  • Always_MyLoverX 2018-02-02 01:26
    关注

    1、executeQuery方法是用的最多的,返回的结果集类型常态,例如select语句,取值和你写法差不多,比较固定的

    2、execute方法,返回的结果集比较多样,例如返回多个结果集、多个更新计数或二者组合的语句,看起来更高级,但是非常少用,而且取值非常麻烦。
    关于取值:前提是知道返回类型是getResultSet情况下,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount,

    如果调用的存储过程不知道返回类型,那就更难处理了。只举例resultset取值

    ResultSet  rst=pst.getResultSet();  
    ResultSetMetaData rdata=rst.getMetaData();  
    int count=rdata.getColumnCount();  
    while(rst.next()){  
        for(int i=0;i<count;i++){  
            System.out.print(rst.getString(i+1)+"/t");  
    
        }     
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制