从ExecuteQuery()获取ResultSet没有正确执行

时间:2012-03-30 02:00:07

标签: javascript sql jsp object

以下代码块是我尝试过的一些代码。我已经在我的JSP页面中设置了测试检查,并且没有超过3.22,从而结束了程序。这是另一组需要在下面提出的关系,但我认为它不会经历。

我正在使用PostgreSQL。所有提取的数据都来自HTML表单(基本上是注册表单)。

我得到了第一个用于Users表的INSERT,它运行良好。按照相同的语法,我想我可以拉出创建的用户ID(它是从我的数据库模式中的序列关系自动创建的)。但是,当我尝试从同一个USers表(从我创建的新创建的元组中)中找到userid时,这不能用于计划,因此我可以使用它来创建新的Locations行。我试着到处寻找,但我没有想法。我需要将此块放在不同的JSP页面中吗?一个不同的连接?关闭并重新打开连接?任何想法都会很棒。

谢谢!

<%@ page import="java.sql.*"%>
<%@ page import="java.lang.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>

<%@ page import="org.apache.commons.fileupload.FileUploadException" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="DbConnection"
             class="edu.bu.cs.cs460.photoshare.DbConnection">
    <jsp:setProperty name="DbConnection" property="*"/>
</jsp:useBean>

<%
out.println("test check 1");

String email = request.getParameter("email");
String password = request.getParameter("password");
String fname = request.getParameter("fname");
String lname = request.getParameter("lname");

int dob = Integer.parseInt(request.getParameter("dob"));

out.println("test check 2: " + email + " " + password + " " + fname + " " + lname + " " + dob);

try{
    PreparedStatement st_users = null;
    Connection myCon = null;
    out.println("test check 2.21");
    try {
       Context ctx = new InitialContext();
       if (ctx == null) {
        throw new RuntimeException("No Context");
       }
       DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/postgres");
       if (ds == null) {
        throw new RuntimeException("Datasource not found");
       }
       myCon = ds.getConnection();
       if (myCon == null) {
        throw new RuntimeException("Could not get connection");
       }


      } catch (SQLException e) {
       throw new RuntimeException(e);
      } catch (NamingException e) {
       throw new RuntimeException(e.getMessage());
    }



    PreparedStatement getUID = null;    

    getUID=myCon.prepareStatement("SELECT MIN(\"user_id\") FROM \"Users\" as U WHERE \"U.email\" = ?");
    getUID.setString(1, email);
    out.println("test check 3.22");
    ResultSet rs = null;
    rs = getUID.executeQuery();

    out.println("test check 3.999");
    int userid = rs.getInt(1);

    getUID.close();

    //String tempuserid = (String)rs.getAttribute(1);
    //int userid = rs.getInt(1);
    //sint userid = Integer.parseInt(tempuserid);

    out.println("test check 4: " + userid);
    /* now we have the ID from the set  */

    /* this will set the location tabe now for the registered user */

    PreparedStatement st_loc = null;

    st_loc=myCon.prepareStatement("INSERT INTO \"Locations\" (\"user_id\", \"curLoc\", \"hcity\", \"hstate\", \"country\") VALUES (?, ?, ?, ?, ?)");

    String hcity = request.getParameter("city");
    String hstate = request.getParameter("state");
    String curLoc = " ";
    String country = request.getParameter("country");

    out.println("test check 5: " + hcity + " " + hstate + " " + curLoc + " " + country);

    st_loc.setInt(1, userid);
    st_loc.setString(2, curLoc);
    st_loc.setString(3, hcity);
    st_loc.setString(4, hstate);
    st_loc.setString(5, country);   

    st_loc.executeUpdate();

    out.println("test check 6:");
    st_loc.close();
    myCon.close();
    out.println("Data is successfully inserted into database.");
}
catch(Exception e){
    System.out.println(e);

}

%>

1 个答案:

答案 0 :(得分:0)

我看到的主要问题是您在查询中不必要地引用了您的表名和列名。例如:

"SELECT MIN(\"user_id\") FROM \"Users\" as U WHERE \"U.email\" = ?"

...将更好地工作:

"SELECT MIN(user_id) FROM Users as U WHERE U.email = ?"

请注意,这也适用于您的INSERT声明。你为什么要使用MIN(user_id)?您是否允许单个电子邮件地址拥有多个用户帐户?因为这可能不是你想要的方法。

另外,当你说“我得到第一个INSERT工作”时,你的意思并不清楚。代码中只有一个INSERT语句,它位于SELECT语句之后。你的意思是在其他地方你有代码在Users表中插入一行,你确信它是正确的吗?

一些一般性建议:

  1. 不要将Java代码放在JSP文件中。特别是,与获取与数据库的连接以及构造和执行查询相关的业务逻辑在JSP中没有位置。 JSP旨在提供您的webapp的界面/视图,而不是提供其核心业务逻辑。

  2. 考虑使用像Hibernate这样的ORM框架。您可能会发现使用手动构建的JDBC查询比使用它更愉快。