使用java在一个连接中进行多个sql查询

使用java在一个连接中进行多个sql查询,java,mysql,sql,Java,Mysql,Sql,我试图在一个db连接中进行不同的查询,但我找不到方法。 查询是根据之前的结果进行的。 代码如下: String query_disco="SELECT * FROM disco"; String name = ""; String adress=""; String web=""; int disco_id=0; String query_disco_var="SELECT * FROM disco_var"; float price=0;

我试图在一个db连接中进行不同的查询,但我找不到方法。 查询是根据之前的结果进行的。 代码如下:

String query_disco="SELECT * FROM disco";
    String name = "";
    String adress="";
    String web="";
    int disco_id=0;

    String query_disco_var="SELECT * FROM disco_var";
    float price=0;
    String style="";
    String hin="";
    String hout="";
    String party_name="";
    int day=0;

    String docType="";
    String docTable="";
    String docBody="";

    Calendar calendar = Calendar.getInstance();     

    try {

        DAO a= new DAO();
        ResultSet b =a.executarSQL(query_disco);            
        day = calendar.get(Calendar.DAY_OF_WEEK);

        docType ="<!DOCTYPE HTML PUBLIC\"--�//W3C//DTD HTML 4.0       " +"Transitional//EN\">\n";
        docBody =
                "<HTML>\n"+
                "<HEAD><TITLE>HelloWorld!</TITLE></HEAD>\n"+
                "<BODY BGCOLOR=\"#FDF5E6\">\n"+
                "<H1>Disco</H1>\n"+
                "<table border=1>"+
                "<tr> <th> name </th> <th> adress </th> <th> web </th> <th> price </th>" +
                "<th> style </th> <th> horari </th> <th> party name </th> </tr>";


        while(b.next()){

            disco_id=b.getInt("disco_id");
            name=b.getString("name");
            adress=b.getString("adress");               
            web=b.getString("web");             

            query_disco_var = query_disco_var + " WHERE disco_id = " + disco_id + " AND day = " + day;
            DAO d= new DAO();
            ResultSet c = d.executarSQL(query_disco_var);
            price=c.getFloat("price");
            style=c.getString("style");
            hin=c.getString("hin");
            hout=c.getString("hout");
            party_name=c.getString("party_name");

            docTable = docTable + "<tr> <td> "+name+" </td> <td> "+adress+" </td> <th>" +web+ "</td> </tr>"+
                       price+ "</td> <td>" +style+ "</td> <td>" +hin+ "-" +hout+ "</td> <td>" +party_name+ "</td> </tr>";
            query_disco_var="SELECT * FROM disco_var";

        } 

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    out.println(docType+docBody+docTable+
            "</table>" +
            "</BODY></HTML>");
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
}
}

我得到一个例子:

java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
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.getFloat(ResultSetImpl.java:2615)
at com.mysql.jdbc.ResultSetImpl.getFloat(ResultSetImpl.java:2635)
at controllers.HelloWorld.doGet(HelloWorld.java:87)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
问候

ResultSet c = d.executarSQL(query_disco_var);
price = c.getFloat("price");
在从结果集中获取值之前,必须调用next(),将光标放置在第一行上。否则,如异常中所述,您位于结果集开始之前:

ResultSet c = d.executarSQL(query_disco_var);
if (c.next()) {
    price = c.getFloat("price");

另外,请了解,因为通过串联参数将参数传递给查询会使代码容易受到SQL注入攻击,所以只要其中一个字符串参数包含一个引号,ad就会立即中断。

您的
结果集c
永远不会移到第一个结果(如果有)。您应该使用以下内容包装从c读取的代码

if (c.next()) {
  // your original code here
} else {
  // whatever you want to do in this case
}

此外,如果发现多个结果,您可能需要考虑该怎么办。

执行任何SQL后,光标将定位在第一行之前。这就是为什么您会得到Execution,因为没有可用的数据

试试a
c.next()执行第二个SQL查询后。这将光标定位在第一个结果上。请记住,如果没有返回任何数据,此调用将返回
false
,并且任何后续的列提取都将失败,因此您应该捕捉到这一点

if (c.next()) {
  // your original code here
} else {
  // whatever you want to do in this case
}