在开始结果集之前

时间:2014-12-02 04:33:45

标签: java mysql jdbc

我想在一个jsp页面中显示两个表的数据。我收到以下错误。你能解释一下这个错误。

java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1058)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:972)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:958)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:903)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:854)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5772)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5692)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5732)
at jsp_servlet.__userhome._jspService(__userhome.java:149)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:35)
at   weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:243)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3432)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)

UPDATE:    这是代码,导致错误

     PreparedStatement pstm = null;
     String sql = "select * from owner";
     pstm = con.prepareStatement(sql);
     ResultSet rs = pstm.executeQuery();
     ResultSet firstrs=rs;
     String tname=rs.getString("tablename");
     String sql1="SELECT * FROM "+tname;
     Statement stmt=con.createStatement();
     ResultSet rs1=stmt.executeQuery(sql1);
     ResultSetMetaData rsmd=rs1.getMetaData();

2 个答案:

答案 0 :(得分:1)

PreparedStatement pstm = null;
String sql = "select * from owner";
pstm = con.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
ResultSet firstrs=rs;
String tname="";
while(rs.next())//You have to write resultset like this because if result set is empty then it will gaves an error
{
    tname=rs.getString("tablename");
    tname+=",";
}
if(!tname.equal(""))
{
    String sql1="SELECT * FROM "+tname;///It select multiple tables results
    Statement stmt=con.createStatement();
    ResultSet rs1=stmt.executeQuery(sql1);
    ResultSetMetaData rsmd=rs1.getMetaData();
}

答案 1 :(得分:0)

实际原因是,您已在结果集的第一行之前设置了Cursor。

通常的做法是对其进行测试以检查它是否至少有一行,通常在If条件下或循环内,如下所示:

 PreparedStatement pstm = null;
 String sql = "select * from owner";
 pstm = con.prepareStatement(sql);
 ResultSet rs = pstm.executeQuery();
 ResultSet firstrs=rs;
 // So with the following line we set it to the first row of the result set.
 while (rs.next()) {
      String tname=rs.getString("tablename");
 }

 String sql1="SELECT * FROM "+tname;
 Statement stmt=con.createStatement();
 ResultSet rs1=stmt.executeQuery(sql1);

以上第一个答案是正确的。但我想让它变得更有意义。

最诚挚的问候, Randika      ResultSetMetaData rsmd = rs1.getMetaData();

相关问题