1、处理存储过程返回单个结果集的范例:/*****************************************************************************/
<%--
作者:何志强[[email protected]]
日期:2000-08-04
   2000-08-16
版本:1.1
功能:JSP数据库操作例程 - 存储过程 - JDBC-ODBC - SQL ServerSQL Server的存储过程如下:
    create procedure sp_jsptest
       @yourname  varchar(50),
       @myname varchar(50) output
    as
       select "您好,"+@yourname+",非常高兴认识您,^_^"
       set @myname = "何志强"
       return 1
    go
--%><%@ page contentType="text/html;charset=gb2312"%><%
//变量声明
java.lang.String strName; //姓名//取得用户输入的数据
strName = request.getParameter("name");
if(strName==null){//用户没有输入姓名
%><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP数据库操作例程 - 存储过程 - JDBC-ODBC - SQL Server</title>
</head>
<body><form action="jdbc-odbc.jsp" method="post">
您尊姓大名:<input type="text" name="name" maxlength="50">
<input type="submit" value="提交">
</form></body>
</html><%
}
else{
   //对用户输入的数据作必要的字符编码转换
   strName = new java.lang.String(strName.getBytes("iso-8859-1"));   //变量声明
   java.sql.Connection sqlCon;         //数据库连接对象
   java.sql.CallableStatement sqlStmt; //可调用语句对象
   java.sql.ResultSet sqlRst;          //结果集对象   java.lang.String strCon;            //数据库连接字符串
   java.lang.String strSQL;            //SQL语句   java.lang.String strWelcome;        //欢迎词
   java.lang.String strMyName;         //我的姓名
   int intReturn;                      //返回值   //装载JDBC-ODBC驱动程序
   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");   //设置数据库连接字符串
   strCon = "jdbc:odbc:jspdemo";   //连接数据库
   sqlCon = java.sql.DriverManager.getConnection(strCon,"sa","");   //准备SQL语句
   strSQL = "{? = call sp_jsptest(?,?)}";   //准备可调用语句对象
   sqlStmt = sqlCon.prepareCall(strSQL);   //设置输入参数
   sqlStmt.setString(2,strName);   //登记输出参数
   sqlStmt.registerOutParameter(1,java.sql.Types.INTEGER);
   sqlStmt.registerOutParameter(3,java.sql.Types.VARCHAR);   //执行该存储过程并返回结果集
   sqlRst = sqlStmt.executeQuery();   //获取来自结果集中的数据
   sqlRst.next();
   strWelcome = sqlRst.getString(1);   //获取输出参数的值
   strMyName = sqlStmt.getString(3);   //获取返回值
   intReturn = sqlStmt.getInt(1);   //关闭记录集
   sqlRst.close();   //关闭可调用语句对象
   sqlStmt.close();   //关闭数据库对象
   sqlCon.close();
%><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP数据库操作例程 - 存储过程 - JDBC-ODBC - SQL Server</title>
</head>
<body><%=strWelcome%><br>
我是<%=strMyName%><br>
返回值是<%=intReturn%></body>
</html><%
}
%>
/*****************************************************************************/

解决方案 »

  1.   

    Statement接口提供了三种执行SQL语句的方法:
    executeQuery、executeUpdate和execute。使用哪一个方法由SQL语句所产生的内容决定。
    executeQuery 方法用语返回单个结果集
    execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知SQL字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。例如,用户可能执行一个已存储过程,并且该已存储过程可执行更新,然后执行选择,再进行更新,再进行选择,等等。通常使用已存储过程的人应知道它所返回的内容。  因为方法execute处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法execute执行该过程后,必须调用方法getResultSet获得第一个结果集,然后调用适当的getXXX方法获取其中的值。要获得第二个结果集,需要先调用getMoreResults方法,然后再调用getResultSet方法。如果已知某个过程返回两个更新计数,则首先调用方法getUpdateCount,然后调用getMoreResults,并再次调用getUpdateCount。
      

  2.   

    下面的代码演示了一种方法用来确认已访问调用方法execute所产生的全部结果集和更新计数:
    stmt.execute(queryStringWithUnknownResults);
    while(true){
    introwCount=stmt.getUpdateCount();
    if(rowCount>0){//它是更新计数
    System.out.println("Rows changed="+count);
    stmt.getMoreResults();
    continue;
    }
    if(rowCount==0){//DDL命令或0个更新
    System.out.println("No rows changed or statement was DDL command");
    stmt.getMoreResults();
    continue;
    }
    //执行到这里,证明有一个结果集
    //或没有其它结果
    ResultSet rs=stmt.getResultSet();
    if(rs!=null){
    ...//使用元数据获得关于结果集列的信息
    while(rs.next()){
    ...//处理结果
    stmt.getMoreResults();
    continue;
    }
    break;//没有其它结果