枫叶梨花 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");  
    
        }     
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • ysp1399 2018-02-01 14:36
    关注

    cs.execute();
    ResultSet result=cs.executeQuery();
    第一个是执行不带参数
    第二个是带参数查询

    评论
  • weixin_39084835 2018-02-01 15:01
    关注

    cs.execute();
    ResultSet result=cs.executeQuery();
    第一个是执行不带参数
    第二个是带参数查询

    评论
  • 无术同学 2018-02-01 15:52
    关注

    cs.execute();
    ResultSet result=cs.executeQuery();
    第一个是执行不带参数
    第二个是带参数查询.

    评论
  • Chenglin_Yu 2018-02-02 01:15
    关注

    第一个没有获取ResultSet

    评论
  • 技术分子 2018-02-02 03:43
    关注

    cs.execute(); 返回的是boolean 值

    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 arm虚拟机无法和物理机互通
  • ¥15 如何在此代码上增加一个统计学生生源的功能?(语言-c语言)
  • ¥15 Android导航条遮盖异常
  • ¥15 计算机网络技术基础问题
  • ¥15 设置mac系统只能访问指定网站
  • ¥15 西门子博途 s7 1200控制三台步进电机
  • ¥15 基于非参数的方向距离函数求污染物影子价格(有偿)
  • ¥15 vue+element 生成table
  • ¥15 实验 4 FIFO 算法和 LRU 算法-C 程序实现
  • ¥15 有偿拼接大疆精灵4RGB影像