给你一个例子.......... //准备可调用语句对象 
CallableStatement cstmt=conn.prepareCall("{?=call test222(?,?,?)}");    //设置输入参数 
    // cstmt.setString(2,"seven"); 
 
    //登记输出参数 
cstmt.registerOutParameter(1,java.sql.Types.INTEGER);
cstmt.registerOutParameter(2,java.sql.Types.CHAR);
cstmt.registerOutParameter(3,java.sql.Types.VARCHAR);  
    cstmt.registerOutParameter(4,java.sql.Types.INTEGER); 
     
    //输出参数
 int intReturn=-99;
     String  lib_code="lib_code";
     String  lib_name="lib_name";
 int  flag=-99;    //执行该存储过程并返回结果集 
    rs=cstmt.executeQuery();    String rs_libcode;
String rs_libname;
    int    rs_flag;
while (rs.next()) 
    {
   //获取来自结果集中的数据 
       rs_libcode = rs.getString(1); 
      rs_libname = rs.getString(2);
   rs_flag = rs.getInt(3);       out.println("rs_libcode="+rs_libcode+"<br>");
   out.println("rs_libname="+rs_libname+"<br>");
   out.println("rs_flag="+rs_flag+"<br>");
   out.println("=====================================================<br>");
    }    //获取返回值 
    intReturn = cstmt.getInt(1); //获取输出参数的值 
    lib_code= cstmt.getString(2); 
lib_name= cstmt.getString(3); 
flag= cstmt.getInt(4); 
  
    //输出
    out.println("intReturn="+intReturn+"<br>");
out.println("lib_code="+lib_code+"<br>");
out.println("lib_name="+lib_name+"<br>");
out.println("flag="+flag+"<br>");注意:如果你的存储过程中不返还结果集,你需要用cstmt.executeUpdate()或cstmt.execute(),而不是cstmt.executeQuery();

解决方案 »

  1.   

    我觉得我应该是这样做的以下是源代码:
    Connection con = DriverManager.getConnection(url, strDbUser, strDbPass);
    CallableStatement cstmt = con.prepareCall("{call SearchLog(?, ?, ?, ?, ?, ?)}");
    ResultSet Rs;
    if (request.getParameter("Submit") != null){
    //按审核标记查询
    if (request.getParameter("chkFlags") != null){
    cstmt.setInt(2, Integer.parseInt(request.getParameter("rbFlags"), 10));
    }
    else
    cstmt.setNull(2, java.sql.Types.INTEGER);
    //按日期查询
    if (request.getParameter("chkDate") != null){
    cstmt.setString(3, request.getParameter("startDate"));
    cstmt.setString(4, request.getParameter("endDate"));
    }
    else
    {
    cstmt.setNull(3, java.sql.Types.VARCHAR);
    cstmt.setNull(4, java.sql.Types.VARCHAR);
    }
    //按部门查询
    if (request.getParameter("chkDepartment") != null){
    cstmt.setInt(5, Integer.parseInt(request.getParameter("Department")));
    }
    else
    cstmt.setNull(5, java.sql.Types.INTEGER);
    //按人员查询
    if (request.getParameter("chkEmployee") != null)
    {
    if (request.getParameter("employees") != null)
    {
    String strEmployees = new String();
    int i;
    String AEmployees[] = request.getParameterValues("employees");
    strEmployees = AEmployees[0];
    for (i = 1; i < AEmployees.length; i++)
    strEmployees += "," + AEmployees[i];
    cstmt.setString(6,strEmployees);
    }
    else
    cstmt.setNull(6, java.sql.Types.VARCHAR);
    }
    else
    cstmt.setNull(6, java.sql.Types.VARCHAR);

    try
    {
    cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
    cstmt.setInt(1, 0);
    Rs = cstmt.executeQuery();
    Rs.next();
    out.println(cstmt.getInt(1));
    }
    catch(SQLException e)
    {
    response.sendRedirect("Inc/ErrPage.jsp?ErrMsg=搜索数据出现了错误!请检查");
    }
    }以下是错误的信息:java.lang.NumberFormatException: 
    at java.lang.Integer.parseInt(Integer.java:435)
    at java.lang.Integer.<init>(Integer.java:549)
    at sun.jdbc.odbc.JdbcOdbcCallableStatement.getInt(JdbcOdbcCallableStatement.java:385)
    at jrun__workinglog__SearchList2ejsp1a._jspService(jrun__workinglog__SearchList2ejsp1a.java:153)
    at allaire.jrun.jsp.HttpJSPServlet.service(../jsp/HttpJSPServlet.java:39)
    at allaire.jrun.jsp.JSPServlet.service(../jsp/JSPServlet.java:228)
    at allaire.jrun.jsp.JSPServlet.service(../jsp/JSPServlet.java:196)
    at allaire.jrun.servlet.JRunSE.service(../servlet/JRunSE.java:1416)
    at allaire.jrun.session.JRunSessionService.service(../session/JRunSessionService.java:1082)
    at allaire.jrun.servlet.JRunSE.runServlet(../servlet/JRunSE.java:1270)
    at allaire.jrun.servlet.JRunRequestDispatcher.forward(../servlet/JRunRequestDispatcher.java:89)
    at allaire.jrun.servlet.JRunSE.service(../servlet/JRunSE.java:1552)
    at allaire.jrun.servlet.JRunSE.service(../servlet/JRunSE.java:1542)
    at allaire.jrun.servlet.JvmContext.dispatch(../servlet/JvmContext.java:364)
    at allaire.jrun.http.WebEndpoint.run(../http/WebEndpoint.java:115)
    at allaire.jrun.ThreadPool.run(../ThreadPool.java:272)
    at allaire.jrun.WorkerThread.run(../WorkerThread.java:75)
    错误的代码就是out.println(cstmt.getInt(1));
      

  2.   

    Create procedure Searchlog
    (@RCOUNT           int          OUT,
     @nFlags       tinyint        = null,
     @startDate    varchar(10)    = null,
     @endDate      varchar(10)    = null,
     @DepartmentID int            = null,
     @EmployeeIDs  varchar(1024)  = null)
    AS
    BEGIN
      DECLARE @SQL nvarchar(2048)
      SET @SQL = "Select * from v_UserLogs where 1 = 1"
      IF (@nFlags is not null)
        SET @SQL = @SQL + " and workinglogFlags = " + cast(@nFlags as varchar(3));
      IF (@startDate is not null) and (@endDate is not null)
        SET @SQL = @SQL + " AND LogDate between '" + @startDate + "' and '" + @endDate + "'"
      IF (@DepartmentID is not null)
      BEGIN
        SET @SQL = @SQL + " AND EmployeeID in (select EmployeeID FROM Employee "
        SET @SQL = @SQL + " where DepartmentID in "
    SET @SQL = @SQL + " (Select DepartmentID from Department where paths like ";
    SET @SQL = @SQL + " (Select Paths + '%' from Department where DepartmentID =" 
        SET @SQL = @SQL + CAST(@DepartmentID as varchar(9)) + ")))";
      END
      IF (@EmployeeIDs is not null)
        SET @SQL = @SQL + " AND EmployeeID in (" + @EmployeeIDs + ")"
      EXEC sp_executesql @SQL
      SELECT @RCOUNT = @@RowCount
    END这个过程我用查询分析器能够得到返回值!以前用ASP也能得到返回值,我晕
      

  3.   

    你的代码中:
    //按审核标记查询
    if (request.getParameter("chkFlags") != null){
    cstmt.setInt(2, Integer.parseInt(request.getParameter("rbFlags"), 10));
    }
    方法Integer.parseInt()
     parseInt("473", 10) returns 473
     parseInt("-0", 10) returns 0
     parseInt("-FF", 16) returns -255
     parseInt("1100110", 2) returns 102
     parseInt("2147483647", 10) returns 2147483647
     parseInt("-2147483648", 10) returns -2147483648
     parseInt("2147483648", 10) throws a NumberFormatException
     parseInt("99", 8) throws a NumberFormatException
     parseInt("Kona", 10) throws a NumberFormatException
     parseInt("Kona", 27) returns 411787
    上面列的包括正确的和错误的,你应该检查一下数据库中相应字段。
      

  4.   

    程序是这样的,如果我注释掉out.println(cstmt.getInt(1));这行代码就没有错误,如果执行代码就出项我说得那个错误,这行代码是取得返回值的代码啊!而且我在数据库中也是正确定义了的,怎么回事呢!
      

  5.   

    cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
    cstmt.setInt(1, 0);?
      

  6.   

    其实那句是后来我调试才加上的,本来是没有的那段程序只要我调用
    cstmt.getInt(1);
    就会出现java.lang.NumberFormatException: 这个错误 Connection con = DriverManager.getConnection(url, strDbUser, strDbPass);
    CallableStatement cstmt = con.prepareCall("{call SearchLog(?, ?, ?, ?, ?, ?)}");
    ResultSet Rs;
    cstmt.registerOutParameter(1,java.sql.Types.INTEGER);
    if (request.getParameter("Submit") != null){
    //按审核标记查询
    if (request.getParameter("chkFlags") != null){
    cstmt.setInt(2, Integer.parseInt(request.getParameter("rbFlags"), 10));
    }
    else
    cstmt.setNull(2, java.sql.Types.INTEGER);
    //按日期查询
    if (request.getParameter("chkDate") != null){
    cstmt.setString(3, request.getParameter("startDate"));
    cstmt.setString(4, request.getParameter("endDate"));
    }
    else
    {
    cstmt.setNull(3, java.sql.Types.VARCHAR);
    cstmt.setNull(4, java.sql.Types.VARCHAR);
    }
    //按部门查询
    if (request.getParameter("chkDepartment") != null){
    cstmt.setInt(5, Integer.parseInt(request.getParameter("Department"), 10));
    }
    else
    cstmt.setNull(5, java.sql.Types.INTEGER);
    //按人员查询
    if (request.getParameter("chkEmployee") != null)
    {
    if (request.getParameter("employees") != null)
    {
    String strEmployees = new String();
    int i;
    String AEmployees[] = request.getParameterValues("employees");
    strEmployees = AEmployees[0];
    for (i = 1; i < AEmployees.length; i++)
    strEmployees += "," + AEmployees[i];
    cstmt.setString(6,strEmployees);
    }
    else
    cstmt.setNull(6, java.sql.Types.VARCHAR);
    }
    else
    cstmt.setNull(6, java.sql.Types.VARCHAR);

    try
    {
    Rs = cstmt.executeQuery();
    out.println(cstmt.getInt(1));  //错误代码就是它
    }
    catch(SQLException e)
    {
    response.sendRedirect("Inc/ErrPage.jsp?ErrMsg=搜索数据出现了错误!请检查");
    }
    }
      

  7.   

    这个问题经过一天得测试,得到一下得一个结论,我得数据库是SQL Server如果我在存储过程里不返回记录集,我能够得到返回得参数,如果有记录集,在Java中就报java.lang.NumberFormatException错,请问是数据库得限制吗?哪位有没有其他得好的解决办法
      

  8.   

    经过测试,我发现可能是ODBC的问题