各位兄弟姐妹们大家好,有一个问题,已经困扰我好几个小时了,精神差点崩溃了!真诚地寻求各位高手的帮助,非常谢谢!
这是我数据库(Test)中的一张表books:bookName           bookISBN      bookPrice  bookAuthor   publisher     publisherDate  bookType   bookAmount   
Java JDK实例宝典 978-7-121-03651-4   79 夏先波   电子工业出版社    2008-1-24 计算机/程序设计    2
JavaScript权威指南978-7-111-21632-2  109 David Flanagan 机械工业出版社 2007-8-14计算机/程序设计  4
SQL权威指南      978-7-111-22708-3   63.7 范德兰斯       机械工业出版社  2008-1-1 计算机/数据库   5
Oracle 10g宝典   978-7-121-01842-8   89 路川/胡欣杰    电子工业出版社  2006-1-1  计算机/数据库  5
计算机专业英语教程978-7-121-05646-8   35 张景祥         电子工业出版社  2009-2-5 计算机/专业英语 5
精通正则表达式   978-7-121-04684-1    75   Jeffrey E.F.Friedl 电子工业出版社 2007-7-19计算机/程序设计 10
正则表达式入门经典 978-7-302-18382-2  79.5 Andrew Watt     清华大学出版社 2008-10-1 计算机/程序设计 8这是我的存储过程:
create procedure count_books
@type char(20)
as 
  declare @count int
  set @count=0
begin
  select  @count=@count+bookAmount
  from books
  where bookType=@type 
  print rtrim(@type)+'类书籍共有:'+cast(@count as char(2))+'册!'
end
作用是统计相同类型的书籍共有多少册!
调用过程:exec count_books '计算机/程序设计'
执行结果:计算机/程序设计类书籍共有:24册!但是当我在jdbc中调用时,总是会报异常,郁闷啊!import java.sql.*;public class DBConnect {
public static void main(String[] args) {
System.out.println(DBConnect.getConnection());
System.out.println(new DBConnect().getTotalAmount("计算机/程序设计"));
} public static Connection getConnection() {
Connection con = null;
String className = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;databasename=Test";
String user = "sa";
String password = "sa";
try {
Class.forName(className);
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public ResultSet getTotalAmount(String type){
ResultSet rs=null;
try {
Connection con=getConnection();
String sql="{call count_books(?)}";
CallableStatement call=con.prepareCall(sql);
call.setString(1, type);
rs=call.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}
return rs;
}
}异常如下:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]No ResultSet set was produced.我的水平相当一般,出现问题还希望能够得到大家的帮助,真诚地向大家学习,渴望高手能够帮我顺利解决,在这里我衷心地谢谢大家了!

解决方案 »

  1.   

    你应该把统计结果作为Out Parameter,你试试看看
    调用存储过程拿resultset到没做过,基本都是in和out的
      

  2.   

    sql里执行下存储过程,看看有返回值没
      

  3.   

    if(call.execute()==true) rs=call.getResultSet();
    试试
      

  4.   

    No ResultSet set was produced. 
    没有ResultSet可以提供。
      

  5.   

    你的rs.next() 为false! 所有就会报这个异常!
      

  6.   

    你只是打印的,并没有作为out参数啊,jdbc调用需要得到返回来的数据啊
      

  7.   

    楼主很有创意啊,用存储过程作查询这是我前几天刚写的方法。
    /**
     * 生成合同号
     * @param appno    合同审核子流程的业务申请号
     * @param conn     数据库连接
     * @throws Exception   
     */
    public void generateContractCode(String appno,Connection conn)throws Exception{
    try{
    String call="{call pkg_tms_contract_manage.GENERATE_CONTRACT_CODE(?,?)}";
    CallableStatement callableStatement=conn.prepareCall(call);
    callableStatement.setString(1, appno);
    callableStatement.registerOutParameter(2,Types.VARCHAR);
    callableStatement.execute();
    String error=callableStatement.getString(2);
    if(error!=null&&!"".equals(error)){
    throw new Exception(error);
    }
    }catch(Exception e){
    throw e;
    }
    }
    简单解释下:String call="{call pkg_tms_contract_manage.GENERATE_CONTRACT_CODE(?,?)}";
    两个参数:第一个问号是需要传入的参数,String型的,第二个问号是执行后传出的参数,也是String型的,这个是存储过程执行过程中的报错信息,
    callableStatement.registerOutParameter(2,Types.VARCHAR);--第二个参数是传出参数,需要注册一下,并设置这个参数的类型看了下你的存储过程,就是一个简单的查询,这个可以不用存储过程实现,
    你要返回的是ResultSet,直接用Statement或PreparedStatement就行了,这样就可以获得你要的ResultSet,而且不容易出错用存储过程作查询,没这么用过。