使用java在一个连接中进行多个sql查询
我试图在一个db连接中进行不同的查询,但我找不到方法。 查询是根据之前的结果进行的。 代码如下:使用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;
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
}